【问题标题】:getting href after a search搜索后获取href
【发布时间】:2018-03-07 17:08:14
【问题描述】:

搜索成功后,我需要获取搜索后页面上出现的href。

enter = present (driver, By.CSS_SELECTOR, "#search-submit")
driver.execute_script ("arguments[0].click()", enter)
elems = driver.find_elements_by_xpath ("//a[@href]")
# this for loop does not work 
for elem in elems:
     print(elem.get_attribute ("href"))

我来了

StaleElementReferenceException:消息:元素引用已过时

driver.refresh() 不能解决问题。 driver.back() 将改变搜索结果。还能做什么?

更新

弗洛伦特 B 的。解决方案是要走的路。今天我进行了广泛的测试,
像魅力一样工作,速度更快

enter = self.present (driver, By.CSS_SELECTOR, "#search-submit")
driver.execute_script ("arguments[0].click()", enter)
**WebDriverWait (driver, 20).until (EC.staleness_of (enter))**

【问题讨论】:

  • 仅出于调试目的,如果您在单击和 findelements 调用之间添加睡眠,比如说 30 秒,这能解决问题吗?
  • @MoeGhafari,谢谢!睡眠 30 秒有效。如果你把你的建议作为答案,我很乐意接受。
  • 异常表示在您迭代href时页面被重新加载。为了克服这个问题,在迭代链接之前首先等待一个元素变得陈旧:wait.until(EC.staleness_of(bt_submit))
  • @FlorentB.,在我的情况下,bt_submit 是什么?
  • @LetzerWille,bt_submit 是由driver.find_element 返回的WebElement

标签: python-3.x selenium firefox selenium-webdriver


【解决方案1】:

请在调用前休眠 30 秒:

elems = driver.find_elements_by_xpath ("//a[@href]")

很高兴这有帮助。

编辑:

你可以通过execute_script来执行这个脚本

"return window.jQuery && jQuery.active == 0"

如果您希望避免睡眠,如果所有 ajax 请求都完成,则返回 true

【讨论】:

  • 等待固定时间等待随机事件是不可靠的,不推荐。如果页面加载需要 1 秒,您将浪费 29 秒,如果需要 31 秒,您仍然会收到异常。处理这个问题的正确方法是使用服务员来处理陈旧或新的元素。
  • @FlorentB.我同意,建议的解决方案仅用于调试目的,但是使用等待也是不可靠的,因为您无法预先运行知道页面上有多少个 href,最好的方法是是等待页面完成加载,并确保所有ajax请求都完成。
  • 如果您正在等待正确的状态,那么使用服务员是可靠的。当元素与新文档一起使用时,通常会引发陈旧异常。如果页面仍在加载,则不会引发此异常。
猜你喜欢
  • 2021-04-04
  • 2013-12-28
  • 1970-01-01
  • 2016-11-23
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
相关资源
最近更新 更多