我正在使用以下代码检索我的链接:
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
和迭代链接之间的过程最多只是一次。
是否有其他人遇到过这样的问题,并找到了解决方案?
感谢任何指导。
答案 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} }。