首页 > 解决方案 > 使用 WebDriverWait/EC/by 方式单击 python selenium 中的选定元素不起作用

问题描述

这是我关注的文档http://selenium-python.readthedocs.io/waits.html

这会引发异常:

driver = webdriver.Chrome(CHROME_DRIVER_PATH)
iframe_xpath = "//*[@id='targetForCaptcha1']/div/div/iframe"
captcha_iframe = driver.find_element_by_xpath(iframe_xpath)

driver.switch_to_frame(captcha_iframe)
checkBox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, iframe_xpath)))
checkBox.click()
raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:

但是,这有效:

driver = webdriver.Chrome(CHROME_DRIVER_PATH)
iframe_xpath = "//*[@id='targetForCaptcha1']/div/div/iframe"
captcha_iframe = driver.find_element_by_xpath(iframe_xpath)

action=ActionChains(driver)
action.move_to_element(captcha_iframe)
action.click().perform()

以上两个是从头开始运行python脚本的独立会话。

为什么以前的工作似乎是更标准的工作方式?

标签: pythonpython-3.xseleniumselenium-chromedriver

解决方案


iframe 是主 DOM 的一个节点。在您调用后,driver.switch_to_frame(captcha_iframe)您切换到 iframe 的 DOM 并且位于 byBy.XPATH, iframe_xpath的节点不再可访问。

driver.switch_to_frame(captcha_iframe)因此,如果跳过行,它应该仍然可以从主 DOM 访问


推荐阅读