尝试单击循环中的链接时出现StaleElementReferenceException

时间:2018-01-17 04:25:45

标签: python selenium selenium-webdriver staleelementreferenceexception

Please click on the link below to see the link "BEAUTY" on which I am clicking  1.我正在使用此代码点击" Beauty"链接

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()
  1. 在成功点击链接后我收到以下异常,有人能告诉我为什么会收到它吗?

        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)
    

3 个答案:

答案 0 :(得分:0)

试试这个:

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()

答案 1 :(得分:0)

您需要注意以下某些因素:

  • 您尝试使用名称 List 创建object object 是大多数Programming Languages中的保留内置符号。因此,根据Best Programming Practices,我们不应使用 object 这个名称。
  • print ea.text 行严重缩进。您需要添加缩进。
  • click()上使用美容的文字调用WebElement后,您需要打破退出循环。
  • 以下是您自己的工作代码,并进行了一些小调整:

    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
    

答案 2 :(得分:0)

有一种更简单的方法可以做到这一点。您可以使用将指定要单击的类别名称的XPath。这样你就不必循环,它会在一次搜索中找到所需的元素。

Output created: _book/bookdown-demo.html
Warning messages:  
1: In split_chapters(output, gitbook_page, number_sections, split_by,  :
You have 7 Rmd input file(s) but only 0 first-level heading(s). Did you forget 
first-level headings in certain Rmd files?
2: The label(s) intro, methods not found 

我假设您将重复使用此代码。在这种情况下,我会创建一个函数,它接受一个字符串参数,该参数将是您要单击的类别名称。您将该参数提供给上面的XPath,然后您可以单击页面上的任何类别。

我测试了这个并且它正在工作。