python - 硒不阻塞元素
问题描述
我在 Selenium 执行中面临不一致。我在下面粘贴的代码片段的最后一行执行不一致。有时它可以工作,有时它会抛出一个错误,指出找不到元素。在尝试执行点击之前,Selenium 不会“阻止”元素出现吗?我使用 Selenium IDE 生成了它。我在这里缺少什么?
self.driver.find_element(By.CSS_SELECTOR, ".dx-ellipsis:nth-child(2)").click()
self.driver.switch_to.default_content()
self.driver.find_element(By.CSS_SELECTOR, "#PageContentPlaceHolder_TimeControlSplitter_TimeControlContent_TimesheetEntrySplitter_TimesheetDetailsMenu_DXI0_T > .dxm-contentText").click()
解决方案
如果元素碰巧被 JS 动态加载,并且如果您在加载之前搜索它们,Selenium 可能找不到元素。
您可以尝试隐式等待或显式等待。
在隐式等待的情况下,文档说:
隐式等待告诉 WebDriver 在尝试查找任何不立即可用的元素(或多个元素)时轮询 DOM 一段时间。
你可以这样做:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) #wait and poll for 10 seconds
而显式等待意味着显式指定要等待它可用的元素。根据文档:
显式等待是您定义的代码,用于等待特定条件发生,然后再继续执行代码。
你可以这样做:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
element1 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".dx-ellipsis:nth-child(2)")))
element1.click()
self.driver.switch_to.default_content()
element2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#PageContentPlaceHolder_TimeControlSplitter_TimeControlContent_TimesheetEntrySplitter_TimesheetDetailsMenu_DXI0_T > .dxm-contentText")))
element2.click()
推荐阅读
- swiftui - 如何使用 navigationLink 更改 TabView 中的视图顺序 + 奇怪的行为
- r - 有没有办法在“粘贴”中正确显示“表达式”?
- python - pytest --cov 告诉我我没有导入我拥有的东西
- reactjs - 数组不重新渲染的 useState
- detection - ESP32 Google Vision 人脸检测请求失败
- python - AttributeError: 'str' object has no attribute 'problem' -- 不知道为什么
- c++ - 如何使 2 个基类使用其基类的相同属性?
- javascript - 下拉选择jQuery
- assembly - MIPS 汇编中跳转指令中的 4 个最高有效位
- firebase - 有没有办法用 2 where 进行查询,一个用于集合,另一个用于子集合。?