陈旧元素异常python

时间:2018-03-26 11:45:01

标签: python selenium-webdriver

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

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(attribute)抛出过时的元素异常。

现在,鉴于WebDriverWait我认为我会避免这个问题,但它仍然存在。

我很想在页面源加载后将其丢入lxml以完全避免此问题。

建立links和迭代链接之间的过程最多只是一次。

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

感谢任何指导。

2 个答案:

答案 0 :(得分:0)

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

# 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"))

答案 1 :(得分:0)

我遇到类似问题,页面上的某些可移动按钮已过时。

如下:

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

我意识到这是一个非常粗糙(原始,均匀)的解决方案,并且假设该元素变得非常陈旧&#34;是一个时间问题。 我对Python也没那么好,所以这可能需要一些调整......

考虑一下,因为这些元素是链接,也许你不想点击它们,在这种情况下从ActionChains行中删除click()位,或者可能将其更改为{{1} }。