PyCharm and/or python 在调试器中打开 class 之前无法识别 WebElement (Selenium) 变量
PyCharm and/or python isn't recognizing a WebElement (Selenium) variable until I open the class in the debugger
我在项目中遇到了一些非常奇怪的行为。本质上,此自动化使用 selenium 在网页上创建文章,并通过 clicking/opening 文章验证它的存在。但是,当我 运行 未经调试的程序无法在 Web 元素上 "click()"。所以我调查并开始调试。我注意到网络元素 ("target_element") 是 "None"。我继续过去只是为了调试,它未能按预期单击 "target_element"。
当我重新 运行 程序而不是继续时,我在调试视图中打开 class。我看到 "target_element" 存在,所以我继续并 target_element.click() 成功加载网页上的文章。有人对如何解决这个问题有什么建议吗?
TLDR; article.target_element 在 运行 运行程序时不存在,除非我设置断点并在调试器中查看 "article"。然后如果我继续程序 article.target_element 突然存在。
Possible reason is the element load time.
当您 运行 时,测试 Selenium 运行速度快于元素正确加载所需的时间并最终抛出异常。另一方面,在调试期间,您正在介入并为元素加载留出足够的时间,并且 Selenium 可以毫无问题地找到该元素。
如果问题正是上面提到的问题,那么使用 explicit wait 应该是正确的方法。
示例取自 Selenium Python 文档
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")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
我在项目中遇到了一些非常奇怪的行为。本质上,此自动化使用 selenium 在网页上创建文章,并通过 clicking/opening 文章验证它的存在。但是,当我 运行 未经调试的程序无法在 Web 元素上 "click()"。所以我调查并开始调试。我注意到网络元素 ("target_element") 是 "None"。我继续过去只是为了调试,它未能按预期单击 "target_element"。 当我重新 运行 程序而不是继续时,我在调试视图中打开 class。我看到 "target_element" 存在,所以我继续并 target_element.click() 成功加载网页上的文章。有人对如何解决这个问题有什么建议吗?
TLDR; article.target_element 在 运行 运行程序时不存在,除非我设置断点并在调试器中查看 "article"。然后如果我继续程序 article.target_element 突然存在。
Possible reason is the element load time.
当您 运行 时,测试 Selenium 运行速度快于元素正确加载所需的时间并最终抛出异常。另一方面,在调试期间,您正在介入并为元素加载留出足够的时间,并且 Selenium 可以毫无问题地找到该元素。
如果问题正是上面提到的问题,那么使用 explicit wait 应该是正确的方法。
示例取自 Selenium Python 文档
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")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()