【问题标题】:Python + Selenium StaleElement with Loop and ClickPython + Selenium StaleElement 与循环和点击
【发布时间】:2019-05-12 19:01:54
【问题描述】:

我有要遍历的链接,基本上我正在做的是单击链接并断言新页面具有新页面上链接文本的标题。

第一个效果很好,直到我 driver.back() 并寻找下一个链接。

在尝试查找第二个元素的标题时,我得到了一个 StaleElementReference。但我无法重新找到它,因为它正在循环搜索。

 flyoutNavLinkItems = driver.find_elements_by_css_selector(".header-desktop div#megamenu .navLinkItem")
    self.assertEqual(len(flyoutNavLinkItems), constant.FLYOUT_CAT_COUNT)

    for item in flyoutNavLinkItems:
        categoryTitle = driver.find_element_by_css_selector('span.navLinkText').text
        print(f'Category Title {categoryTitle}')
        item.click()

        self.assertIn(categoryTitle, driver.title.upper())
        driver.back()
        time.sleep(2)

【问题讨论】:

  • driver.execute_script("window.history.go(-1)") 试试用这个代替 driver.back()
  • 已尝试:仍然 selenium.common.exceptions.StaleElementReferenceException:消息:过时的元素引用:元素未附加到页面文档
  • 我需要一个完整的代码来测试,但我建议将计时器放在 self.assertIn 之上,然后在它之后,也为了调试目的添加打印语句,看看它为 categoryTitle 输出了什么
  • 老实说,这就是你真正需要的,flyoutNavlinks 是一堆锚标签。阅读文本,首先单击,将文本与屏幕进行比较,返回,执行下一步。但在下一次它打破了。我已经尝试过使用计时器,但由于循环中的项目,仍然是 StaleElementReference。
  • 你了解什么是陈旧元素吗?

标签: python selenium selenium-webdriver


【解决方案1】:

通过 css-selector n-th child 和 index 找到解决方法:

for index, item in enumerate(flyoutNavLinkItems):
    print(f'Index {index}')
    selectorToSearch = f'div#megamenu .navLinkItem:nth-of-type({index + 1})'
    item = driver.find_element_by_css_selector(selectorToSearch)
    categoryTitle = driver.find_element_by_css_selector(selectorToSearch + ' span.navLinkText').text
    print(f'Category Title {categoryTitle}')
    item.click()
    time.sleep(2)
    self.assertIn(categoryTitle, driver.title.upper())
    driver.back()
    time.sleep(2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2017-09-09
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多