当前位置: 首页 > 知识库问答 >
问题:

过时元素异常python

古畅
2023-03-14

我正在使用以下代码检索我的链接:

os.environ['MOZ_HEADLESS'] = '1'
binary = FirefoxBinary('C:\\Program Files\\Mozilla Firefox\\firefox.exe', log_file=sys.stdout)
self.driver = webdriver.Firefox(firefox_binary=binary, executable_path='C:/chromedriver/geckodriver')

self.driver.get(link)

接下来,我呼吁:

xpath=".//a[@class='tileLink']"
ignored_exceptions = (NoSuchElementException, StaleElementReferenceException,)

your_element = WebDriverWait(self.driver, 30, ignored_exceptions=ignored_exceptions).until(
                expected_conditions.presence_of_element_located((By.XPATH, xpath)))

然后

links = self.driver.find_elements_by_xpath(".//a[@class='tileLink']")
for link in links:
     href_ = link.get_attribute("href") # <<-- Error ehre

并且link.get_attribute(属性)抛出过时的元素异常

现在,考虑到WebDriverWait,我本以为可以避免这个问题,但它仍然存在。

我很想在加载页面源代码后,将其放入lxml中,以完全避免这个问题。

建立链接和迭代链接之间的时间最多为一秒钟。

有没有其他人遇到过这样的问题,并找到了解决方案?

感谢您的指导。

共有2个答案

仲俊豪
2023-03-14

我有一个类似的问题,页面上的一些可移动按钮过时了。

比如:

from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.action_chains import ActionChains

hrefs = []
for index, link in enumerate(links):
    attempts = 0
    while True:
        try:
            for action in range(0, 10):
                ActionChains(context.browser). \
                    move_to_element(links[index]).click().perform()
                href_ = link.get_attribute("href")
                if href_:
                    hrefs.append(href_)
                    break
            break
        except StaleElementReferenceException:
            attempts += 1
            if attempts > 10:
                break

我意识到这是一个非常粗糙(原始,甚至)的解决方案,并假设元素变得“不过时”是一个时间问题。我也不太擅长Python,所以这可能需要一些调整。。。

考虑一下,由于这些元素是链接,可能您不想单击它们,在这种情况下,请从ActionChains行中删除click()位,或者将其更改为context\u click()

乌翰学
2023-03-14

如果我理解了您的问题,您需要从xpath//a[@class='tileLink']标识的所有元素中获取href属性。要实现这一点,可以使用以下代码块:

# xpath=".//a[@class='tileLink']"
# ignored_exceptions = (NoSuchElementException, StaleElementReferenceException,)
# links = WebDriverWait(self.driver, 30, ignored_exceptions=ignored_exceptions).until(expected_conditions.presence_of_element_located((By.XPATH, xpath)))
links = WebDriverWait(self.driver, 30).until(expected_conditions.visibility_of_all_elements_located((By.XPATH, "//a[@class='tileLink']")))
for link in links:
     print(link.get_attribute("href"))
 类似资料:
  • 我试图自动化一个场景,条件是我必须选择所有下拉选项,然后逐个单击这些选项。我尝试了代码,但它只点击了第一个选项,。将错误显示为陈旧元素是不可点击的。请帮忙。

  • 大家好,我正在使用selenium webdriver,在运行下面的脚本时,我在脚本中突出显示的位置遇到了陈旧元素异常错误。 我的脚本停在那里,我不能运行。 错误消息为-Stale元素异常错误。在缓存中找不到该元素,可能是页面在查找后发生了更改。 在这种情况下,请任何人帮助我,并指导我纠正这个错误。 你好Vignesh K S

  • 好的,我阅读了所有其他的链接,我尝试了上述不同解决方案的变体,但是它们都不适合我。 我的问题是,我有以下代码: 然而,我得到了以下错误: 这是篮子图标的css路径,它在菜单上。 网站是GWT,步骤如下:1。点击物品添加到购物篮2。增加到第三篮。点击篮子进入篮子。 然而,我似乎无法做到这一点。

  • 我正在使用for循环来处理表元素。在第一次迭代中,它将在页面上搜索所需的元素。如果该元素在该页面上不可用,那么它将在第二个页面上搜索。如果元素在第一个页面上可用,Webdriver会成功地找到该元素,但如果元素在第一个页面上不可用,则它会在第二个页面上查找该元素。但在这里,for循环失败,出现称为“stale Element exception”的异常。 错误消息: 线程“main”org.ope

  • 下面是我正在努力工作的代码。 我从一个站点地图页面获取所有锚元素,然后将所有这些元素放入一个列表中。然后,我使用从所有这些元素获取URL。在这里之前,代码运行良好。 然而,之后我将这些URL作为参数,并将其传递到方法,以使用。代码一直工作到第一个链接,但一旦加载了第一个页面,就会出现stale元素异常。