Webdriver等待或等效 - 具有属性

时间:2018-02-12 12:33:16

标签: python selenium selenium-webdriver staleelementreferenceexception

我有一段代码,使用Selenium循环遍历页面中的链接。 我已将Time.sleep(3)替换为WebDriverWait()以尝试加快速度(因为我已经浏览了50页),但我无法让它发挥作用。由于某种原因implicitly_wait(30)没有做到这一点。

没有任何Time.sleep()WebDriverWait()代码在尝试声明变量" elems"时会生成陈旧的元素引用错误,因为驱动程序无法找到任何元素通过xpath - 不足为奇。

我在这里使用的WebDriverWait()解决了这个问题,但随后代码运行到另一个:在嵌套for循环的最后一行,它抛出了另一个陈旧的元素引用错误。似乎虽然在WebDriverWait()允许代码继续时加载了元素,但这些元素的属性并不一定就绪。

我的目标是尽可能快地编写代码,因此Time.sleep(10)或类似的东西不会非常吸引人。如何在继续之前顺利确保所有元素及其属性都已加载?为什么hiddenly_wait(30)不能解决这个问题呢?

编辑:相关网址:从http://www.oddsportal.com/baseball/usa/mlb-2017/results/#/page/1/http://www.oddsportal.com/baseball/usa/mlb-2017/results/#/page/50/

PageRange = range(1, 50)
for page in PageRange:
    URL = "http://www.oddsportal.com/baseball/usa/mlb-" + season + "/results/#/page/" + str(page) + "/"
    driver.get(URL)
    tryElement = EC.presence_of_element_located((By.XPATH, "//a[@href]"))
    WebDriverWait(driver, 30).until(tryElement)
    elems = driver.find_elements_by_xpath("//a[@href]")
    for elem in elems:
        #This line I can't get not to throw a stale element reference 
        link = elem.get_attribute("href") 

1 个答案:

答案 0 :(得分:0)

根据您提供的参考代码块,您可以使用以下代码块来避免StaleElementReferenceException

PageRange = range(1, 50)
for page in PageRange:
    URL = "http://www.oddsportal.com/baseball/usa/mlb-" + season + "/results/#/page/" + str(page) + "/"
    driver.get(URL)
    elems = WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@href]")))
    for elem in elems:
        print(elem.get_attribute("href"))