【问题标题】:Python Selenium wait for innerHTMLPython Selenium 等待 innerHTML
【发布时间】:2018-02-04 23:58:41
【问题描述】:

我正在尝试等待 innerHTML 元素加载。这是我的代码的通用版本:

element = WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.XPATH, XPATH)))
element = element.get_attribute('innerHTML')

元素是表格内的 tr 标签。此代码位于一个循环内,该循环应该在数千个 ajax 页面上每页运行 25 次。运行一定数量后,我继续收到此错误:

selenium.common.exceptions.StaleElementReferenceException: Message: {"errorMessage":"Element is no longer attached to the DOM"...

每次,此错误都源于提供的代码的第二行。这让我相信元素正在加载,但 innerHTML 加载速度不够快,这会引发给定的错误消息。我尝试了很多方法来解决这个问题。

在确认元素存在后,如何让我的代码等待 innerHTML 加载?

【问题讨论】:

  • 您知道我们可以等待出现在innerHTML 中的特定子字符串或文本吗?
  • 它正在从数据库中提取数据。随着循环的运行,元素的innerHTML会发生数百万次变化
  • @alecxe 也许我可以使用表格标题中的 innerHTML?
  • 不幸的是,没有提供足够的详细信息来回答这个问题..您能否发布一个示例,说明element 指向的内容以及元素内部 HTML 中的哪些变化?..谢谢!
  • 是的,当然。 element 是表格内的一个单元格(tr 标记),具有一致的表格标题(th 标记)。每个element 的内部 HTML 每页更改 25 倍,而每页上的表头都相同

标签: python ajax python-2.7 selenium phantomjs


【解决方案1】:

很好,您使用的是 python,您也可以这样编写等待条件。

innerHTML = WebDriverWait(driver, 5).until(lambda driver: driver.find_element_by_xpath(XPATH).get_attribute("innerHTML"))

或者像这样

WebDriverWait(driver, 5).until(lambda driver: driver.find_element_by_xpath(XPATH).get_attribute("innerHTML") == "expected text")

【讨论】:

  • Python 不允许我在 until() 函数中使用 == 运算符。我很确定它不接受布尔值。第一个答案仍然返回相同的错误消息selenium.common.exceptions.StaleElementReferenceException: Message: {"errorMessage":"Element is no longer attached to the DOM"
  • 它不是布尔值,它是一个函数。我已经测试过了,它工作得很好。
  • 这确实有效!谢谢!我可以问是否不是比较字符串?和“预期文本”?我们如何才能做到这一点,我们正则表达式?嗯...我还可以澄清一下,第二个代码答案发生的情况是驱动程序等待基于 XPATH 的元素,如果它的 innerHTML 等于预期的文本,对吗?谢谢!
  • 我试过这个WebDriverWait(browser, 20).until(lambda browser: re.search(regex,browser.find_element_by_xpath(my_xpath).get_attribute("innerHTML"))),谢谢!
猜你喜欢
  • 2018-08-09
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2022-01-21
  • 2017-03-27
  • 1970-01-01
相关资源
最近更新 更多