首页 > 解决方案 > 硒不阻塞元素

问题描述

我在 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()

标签: pythonseleniumselenium-webdriveriframewebdriverwait

解决方案


如果元素碰巧被 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()

推荐阅读