【问题标题】:selenium while loop not working硒while循环不起作用
【发布时间】:2017-08-01 23:12:52
【问题描述】:

所以我开始掌握 while 循环的窍门,但是当在 selenium 代码上使用 while 循环时,我做不到。

我几乎尝试将一个任务复制 10 次,代码如下所示

Main.py

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


driver = webdriver.Chrome()
driver.get('https://orlando.craigslist.org/search/cta')

owl = driver.find_element_by_xpath('//*[@id="sortable-results"]/ul/li/p/a')
res = 1

while res < 10:
    owl2 = owl.click()
    driver.find_element_by_xpath('/html/body/section/header/nav/ul/li[3]/p/a').click()

    res = res + 1

这是错误

Traceback(最近一次调用最后一次): 文件“main.py”,第 12 行,在 owl2 = owl.click() 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py”, 第 77 行,点击 self._execute(Command.CLICK_ELEMENT) 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py”, 第 491 行,在 _execute return self._parent.execute(命令,参数) 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py”, 第 238 行,执行中 self.error_handler.check_response(响应) 文件“/Library/Python/2.7/site-packages/selenium/webdriver/remote/errorhandler.py”, 第 193 行,在 check_response 中 引发异常类(消息、屏幕、堆栈跟踪) selenium.common.exceptions.StaleElementReferenceException:消息:过时的元素引用:元素未附加到页面 文档 (会话信息:chrome=56.0.2924.87) (驱动程序信息:chromedriver=2.27.440174(e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),平台=Mac OS X 10.11.2 x86_64)

有什么建议吗?

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    很简单地说:你必须用循环开始你的测试用例,这意味着“for”必须是你的测试用例中的第一个命令,之后的一切。 示例:

    def test_case(self):
         login_page = LoginPage(self.driver)
         for element in element_to_check:
              assert element
    

    行不通。它在第一个循环后停止。相反,只需像这样重写您的代码:

    def test_case(self):
     for element in element_to_check:
          login_page = LoginPage(self.driver)
          assert element
    

    【讨论】:

      【解决方案2】:

      每次 DOM 更改或刷新时,driver 都会丢失它之前定位的元素,从而导致错误。

      StaleElementReferenceException:消息:过时的元素引用: 元素未附加到页面文档

      您需要重新定位它们才能与它们互动。此外,click() 不返回任何值,因此您无法将其分配给任何东西

      res = 1
      while res < 10:
          owl = driver.find_element_by_xpath('//*[@id="sortable-results"]/ul/li/p/a')
          owl.click()
          driver.find_element_by_xpath('/html/body/section/header/nav/ul/li[3]/p/a').click()
          res = res + 1
      

      编辑

      使用for 循环所有项目,您可以将项目定位到列表中并按索引单击

      size = len(driver.find_elements_by_xpath('//*[@id="sortable-results"]/ul/li/p/a'))
      for i in range(0, size):
          owl = driver.find_elements_by_xpath('//*[@id="sortable-results"]/ul/li/p/a')
          owl[i].click()
          driver.find_element_by_xpath('/html/body/section/header/nav/ul/li[3]/p/a').click()
      

      【讨论】:

      • 这很好用,现在您不必回答这个问题,但是,您将如何在“For 循环”中执行此操作。对于每个列表
      • @OwlMan 我添加了一个for循环的例子
      • @OwlMan 已编辑以包含所有项目。
      【解决方案3】:

      错误信息给了我们一个线索:

      Message: stale element reference: element is not attached to the page document
      

      这里发生的情况是,您正在单击一个链接,然后导航到另一个页面,因此,由于您位于不同的页面上,因此您获得了过时的元素。 您将需要导航回同一页面,请尝试以下操作:

      driver.execute_script("window.history.go(-1)")
      

      在 click() 事件之后。

      【讨论】:

      • 仍然没有复制任务 10 次
      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2023-03-22
      • 1970-01-01
      • 2022-12-12
      • 2020-03-30
      相关资源
      最近更新 更多