Как я понимаю, на самом деле ваше требование - иметь WebDriverWait
с двумя ожидаемыми условиями, а не использовать цепочку методов и библиотеку pipe
любой ценой.
Вы можете сделать это, нажавнемного синтаксис лямбда-выражения.Самое чистое решение - сделать его перечислимым по вызовам функций и получить возвращаемое значение того, что вам нужно:
element = WebDriverWait(driver, 5).until(lambda x: (x.find_element_by_xpath("//input[@id='email']"), x.find_element_by_css_selector("table[role='presentation']"))[1])
С индексом вы получите второй член кортежа, например, table
element.
Выражение можно переписать в логическое значение:
element = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath("//input[@id='email']") and x.find_element_by_css_selector("table[role='presentation']"))
И вы снова получите второй элемент, последнюю часть логического значения.Эта реализация имеет некоторые подводные камни, когда (ab) используется со слишком сложным логическим значением, поэтому YMMV;Я бы придерживался 1-го, перечисляемого.
При таком подходе вы получаете преимущества WebDriverWait
- если какой-либо из вызовов в кортеже вызовет одно из обработанных исключений, произойдет повторный вызов,и т. д.
Однако при таком подходе есть один недостаток производительности - вызов первого метода будет выполняться в каждом цикле, даже если он уже прошел успешно, а теперь ожидается второе условие.
И, вот совершенно другая альтернатива, самое чистое решение - я вижу, что вы не стесняетесь использовать xpath, поэтому чисто xpath.
Поскольку ваша цель - получить элемент table
, если и только если присутствует input
, это будет сделано именно так:
//table[@role='presentation' and ancestor::*//input[@id='email']]
Это выберет table
с ролью.Другое условие для этого - подняться по своим предкам - и ось ancestor
поднимется до верхнего узла в DOM - и оттуда найти элемент input
с этим атрибутом id.
Таким образом, если input
все еще отсутствует, xpath не будет ничего совпадать.В тот момент, когда он доступен, и есть также table
с этим значением роли - оно будет возвращено.
Естественно, этот селектор может использоваться непосредственно в WebDriverWait
с одним условием:
element = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath("//table[@role='presentation' and ancestor::*//input[@id='email']]"))