尝试单击循环中的链接时出现 StaleElementReferenceException
StaleElementReferenceException when trying to click on the links in a loop
Please click on the link below to see the link "BEAUTY" on which I am clicking
1. 我正在使用此代码点击 "Beauty" link
driver = webdriver.Chrome("C:\Users\gaurav\Desktop\chromedriver_win32\chromedriver.exe")
driver.maximize_window()
driver.get("http://shop.davidjones.com.au")
object = driver.find_elements_by_name('topCategory')
for ea in object:
print ea.text
if ea.text == 'Beauty':
ea.click()
我成功点击 link 后出现以下异常,谁能告诉我为什么会出现这种情况?
Traceback (most recent call last):
File "C:/Users/gaurav/PycharmProjects/RIP_CURL/login_raw.py", line 10, in <module>
print ea.text
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 73, in text
return self._execute(Command.GET_ELEMENT_TEXT)['value']
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 493, in _execute
return self._parent.execute(command, params)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, 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
(Session info: chrome=63.0.3239.132)
(Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.2.9200 x86_64)
试试这个:
from selenium import webdriver
print("bot started")
#chromeOptions = webdriver.ChromeOptions()
#driver = webdriver.Chrome(chrome_options=chromeOptions)
def specific_text(text, ea):
return str(text) == ea.text
driver = webdriver.Chrome("C:\Users\gaurav\Desktop\chromedriver_win32\chromedriver.exe")
driver.maximize_window()
driver.get("http://shop.davidjones.com.au")
object_ = driver.find_elements_by_name('topCategory')
text_headers = [str(specific_text('Beauty', ea)) for ea in object_]
#print(text_headers)
index_text = text_headers.index("True")
#print(index_text)
object_[index_text].click()
您需要注意以下某些因素:
- 您已尝试创建名为
object
的 List
。 object
是 在大多数 Programming Languages
中保留的内置符号 。所以根据 Best Programming Practices
我们不应该使用名称 object
.
print ea.text
行缩进错误。您需要添加缩进。
- 一旦你在
WebElement
上调用 click()
并且文本为 Beauty 你需要 break循环。
这是您自己的工作代码,经过一些小的调整:
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r'C:\path\to\chromedriver.exe')
driver.maximize_window()
driver.get("http://shop.davidjones.com.au")
object1 = driver.find_elements_by_name('topCategory')
for ea in object1:
print (ea.text)
if ea.text == 'Beauty':
ea.click()
break
控制台输出:
Sale
Brands
Women
Men
Shoes
Bags & Accessories
Beauty
有一种更简单的方法可以做到这一点。您可以使用 XPath 来指定要单击的类别名称。这样您就不必循环,它会在一次搜索中找到所需的元素。
//span[@name='topCategory'][.='Beauty']
我假设您将重复使用此代码。在这种情况下,我会创建一个函数,该函数采用一个字符串参数,该参数将是您要单击的类别名称。您将该参数输入到上面的 XPath 中,然后您可以单击页面上的任何类别。
我测试了这个并且它正在工作。
Please click on the link below to see the link "BEAUTY" on which I am clicking 1. 我正在使用此代码点击 "Beauty" link
driver = webdriver.Chrome("C:\Users\gaurav\Desktop\chromedriver_win32\chromedriver.exe")
driver.maximize_window()
driver.get("http://shop.davidjones.com.au")
object = driver.find_elements_by_name('topCategory')
for ea in object:
print ea.text
if ea.text == 'Beauty':
ea.click()
我成功点击 link 后出现以下异常,谁能告诉我为什么会出现这种情况?
Traceback (most recent call last): File "C:/Users/gaurav/PycharmProjects/RIP_CURL/login_raw.py", line 10, in <module> print ea.text File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 73, in text return self._execute(Command.GET_ELEMENT_TEXT)['value'] File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 493, in _execute return self._parent.execute(command, params) File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in execute self.error_handler.check_response(response) File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, 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 (Session info: chrome=63.0.3239.132) (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.2.9200 x86_64)
试试这个:
from selenium import webdriver
print("bot started")
#chromeOptions = webdriver.ChromeOptions()
#driver = webdriver.Chrome(chrome_options=chromeOptions)
def specific_text(text, ea):
return str(text) == ea.text
driver = webdriver.Chrome("C:\Users\gaurav\Desktop\chromedriver_win32\chromedriver.exe")
driver.maximize_window()
driver.get("http://shop.davidjones.com.au")
object_ = driver.find_elements_by_name('topCategory')
text_headers = [str(specific_text('Beauty', ea)) for ea in object_]
#print(text_headers)
index_text = text_headers.index("True")
#print(index_text)
object_[index_text].click()
您需要注意以下某些因素:
- 您已尝试创建名为
object
的List
。object
是 在大多数Programming Languages
中保留的内置符号 。所以根据Best Programming Practices
我们不应该使用名称object
. print ea.text
行缩进错误。您需要添加缩进。- 一旦你在
WebElement
上调用click()
并且文本为 Beauty 你需要 break循环。 这是您自己的工作代码,经过一些小的调整:
from selenium import webdriver driver = webdriver.Chrome(executable_path=r'C:\path\to\chromedriver.exe') driver.maximize_window() driver.get("http://shop.davidjones.com.au") object1 = driver.find_elements_by_name('topCategory') for ea in object1: print (ea.text) if ea.text == 'Beauty': ea.click() break
控制台输出:
Sale Brands Women Men Shoes Bags & Accessories Beauty
有一种更简单的方法可以做到这一点。您可以使用 XPath 来指定要单击的类别名称。这样您就不必循环,它会在一次搜索中找到所需的元素。
//span[@name='topCategory'][.='Beauty']
我假设您将重复使用此代码。在这种情况下,我会创建一个函数,该函数采用一个字符串参数,该参数将是您要单击的类别名称。您将该参数输入到上面的 XPath 中,然后您可以单击页面上的任何类别。
我测试了这个并且它正在工作。