【问题标题】:Selenium clicks one time, but next click returns StaleElementReferenceExceptionSelenium 单击一次,但下一次单击返回 StaleElementReferenceException
【发布时间】:2018-03-28 23:02:27
【问题描述】:
import sys
import urllib2
import time
from bs4 import BeautifulSoup
from selenium import webdriver
import string
import re

reload(sys)
sys.setdefaultencoding('utf8')

baseUrl = 'https://www.breastsurgeons.org/new_layout/membership/membersearch/index.php'

driver = webdriver.Chrome('/usr/local/Cellar/chromedriver/2.36/bin/chromedriver')
driver.get(baseUrl)
time.sleep(20)

for p in range(1,282):

    driver.find_element_by_xpath("//a[contains(text(),'>>')]").click()
    time.sleep(2)

driver.quit()

打开 baseUrl 后,我手动单击同意,然后搜索要显示的医生列表。我想翻阅清单。现在 Selenium 仅通过查找“>>”第一次单击。之后它停止并给出以下错误。

   driver.find_element_by_xpath("//a[contains(text(),'>>')]").click()


  File "/Library/Python/2.7/site-packages/selenium-3.11.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 80, in click


    self._execute(Command.CLICK_ELEMENT)


  File "/Library/Python/2.7/site-packages/selenium-3.11.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 628, in _execute


    return self._parent.execute(command, params)


  File "/Library/Python/2.7/site-packages/selenium-3.11.0-py2.7.egg/selenium/webdriver/remote/webdriver.py", line 312, in execute


    self.error_handler.check_response(response)


  File "/Library/Python/2.7/site-packages/selenium-3.11.0-py2.7.egg/selenium/webdriver/remote/errorhandler.py", line 242, in check_response


    raise exception_class(message, screen, stacktrace)


selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

【问题讨论】:

    标签: python google-chrome selenium selenium-webdriver webdriver


    【解决方案1】:

    错误说明了一切:

    selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
    

    for() 循环内的程序中,您将在页面上找到带有文本为>><a> 标记元素并调用click() 并且由于click() 事件HTML DOM 更改。当您的程序第二次迭代 for() 循环时,标识为 driver.find_element_by_xpath("//a[contains(text(),'>>')]")WebElement 可能不会被加载,但 Selenium 会尝试引用上一个搜索已经变成陈旧的迭代。因此您会看到 StaleElementReferenceException

    解决方案

    迭代页面的一种令人信服的方法是:

    driver.find_element_by_xpath("//a[contains(text(),'>>')]").click()
    

    对于具有特定 页码(例如 3 45 等)可点击如下:

    WebDriverWait(self.driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(),'3')]"))).click()
    

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 2011-06-28
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多