Selenium 显式等待 invisibility_of_element() 根本不等待
Posted
技术标签:
【中文标题】Selenium 显式等待 invisibility_of_element() 根本不等待【英文标题】:Selenium Explicit Waits for invisibility_of_element() not waiting at all 【发布时间】:2022-01-07 07:40:46 【问题描述】:我试图让 Selenium 等到加载器 div 不可见。
这些是我的导入:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.support.ui import expected_condition as EC
我首先单击一个按钮以打开一个弹出窗口,其中包含表格数据。
action.click()
action.perform()
点击后,我必须等到我可以按下按钮才能将这些数据导出到文件中。但是,我必须等待的时间差别很大。有时10秒有时几分钟。在此部分加载时,会出现一个加载器,阻止我点击屏幕上的任何位置。
我试图让 Selenium 等到这个加载器消失。但是,由于某种原因,脚本根本不等待。甚至没有传递给显式等待函数的最长时间。
time.sleep(10)
print("Waiting for button")
wait = WebDriverWait(driver, 30) # I am just testing with 30, it will be a larger value
wait.until(EC.invisibility_of_element((By.XPATH, "//div[@class='loader']")))
print("Finished Waiting for button")
driver.find_element_by_xpath("//button[@class='export']").click()
首先,我让 Selenium 等待 10 秒,以便加载器元素可以真正显示出来,它已经在 1-2 秒内显示出来。 之后,我使用 print 语句检查脚本实际等待的时间。 脚本根本不等待。它立即继续,然后导致错误,因为该按钮尚不可点击。
【问题讨论】:
用相关的 html 更新问题 【参考方案1】:您传递的是 By.locator
,因此您必须使用 invisibility_of_element_located()
而不是 invisibility_of_element()
。
首先等待 visibility 然后等待 invisibility 你需要的元素:
首先诱导WebDriverWait为visibility_of_element_located()
然后将WebDriverWait诱导为invisibility_of_element如下:
WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='loader']")))
WebDriverWait(driver, 30).until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='loader']")))
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
【讨论】:
以上是关于Selenium 显式等待 invisibility_of_element() 根本不等待的主要内容,如果未能解决你的问题,请参考以下文章