如何通过Python使用Selenium在invisibility_of_element_located上等待多个条件

时间:2019-05-30 17:33:26

标签: python selenium xpath lambda webdriverwait

我要等待Se​​lenium上的元素消失,但同时我必须确保所有元素都消失了。现在,是这样的:

element = WebDriverWait(driver, 30).until(
    expected_conditions.element_to_be_clickable((By.XPATH, xpath))
)
is_clickable = WebDriverWait(driver, 30).until(
    expected_conditions.invisibility_of_element_located((By.XPATH, layovers[0]))
)
is_clickable_2 = WebDriverWait(driver, 30).until(
    expected_conditions.invisibility_of_element_located((By.XPATH, layovers[1]))
)

if is_clickable and is_clickable_2:
    element.click()

layovers列表中有两个以上的元素,它们将xpath存储为str

在这种情况下,我可以将它们全部合并为一个功能来检查元素的隐身性,而不是重复它们吗? (我的意思是,使 WebDriverWait 仅接受一个调用,而不定义另一个包装函数。)

2 个答案:

答案 0 :(得分:0)

第一件事:

在编写WebDriverWait(driver, 30)时,将创建一个Web驱动程序等待对象(显式等待)。

相反,您可以执行以下操作:

wait = WebDriverWait(driver,10) 

,您可以在同一类中多次使用引用变量wait

您可以创建一个方法,该方法将使用 webdriverwait 引用,并可以根据需要通过 xpath 或定位器。

def my_method(wait, xpath):
wait.until(
    expected_conditions.invisibility_of_element_located((By.XPATH, layovers[0]))

希望这会有所帮助。

答案 1 :(得分:0)

until_not()

来自until_not(method, message='')类的WebDriverWait方法调用驱动程序随附的方法作为参数,直到返回值为 False


此用例

由于您的用例是要在invisibility_of_element_located()上等待多个条件,因此您可以同时考虑这两个Expected_condition:

  • WebDriverWait(driver, 30).until(expected_conditions.invisibility_of_element_located((By.XPATH, layovers[0])))
  • WebDriverWait(driver, 30).until(expected_conditions.invisibility_of_element_located((By.XPATH, layovers[1])))

使用 until_not() 方法通过 lambda 表达式在单个表达式内,如下所示:

WebDriverWait(driver,15).until_not(lambda driver: driver.find_element(By.XPATH,layovers[0]) and driver.find_element(By.XPATH,layovers[1]))

Outro

您可以在以下位置找到一些类似的相关讨论: