单击链接时我的脚本遇到错误

时间:2018-07-05 20:50:23

标签: python python-3.x selenium selenium-webdriver web-scraping

我用python与硒关联编写了一个脚本,以启动对与网页中每个个人资料相关的某些链接的点击。我的脚本在第一个链接方面做得很好。由于没有有效的链接(所有链接都是javascript链接)连接到每个个人资料,因此我不得不点击。但是,当应该单击下一个链接等时,它将引发错误stale element reference: element is not attached to the page document。如果不是要单击,则可以按照我在脚本中应用的逻辑轻松导航到每个配置文件,而不会出现该错误。如果要周期性地单击链接,我找不到任何前进的想法。

现在我该怎么办才能消除该错误并单击所有链接?

这是我的尝试:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def search_links(driver,link):
    driver.get(link)
    items = [item for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#main table tr a"))) if "#" not in item.get_attribute("href")]
    for item in items:
        item.click() #The error is thrown here as soon as the script goes for the second click
        wait.until(EC.staleness_of(item))

if __name__ == '__main__':
    url = "https://intraweb.stockton.edu/eyos/page.cfm?siteID=58&pageID=7&action=dirmain&type=FAC&display=basic"
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 10)
    try:
        search_links(driver,url)
    finally:
        driver.quit()

2 个答案:

答案 0 :(得分:1)

这有效

def search_links(driver,link):
driver.get(link)
items = [item for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#main table tr a"))) if "#" not in item.get_attribute("href")]
for i in range(0, len(items)):
    items = driver.find_elements_by_css_selector("#main table tr a")
    items[i].click()
    driver.find_element_by_link_text("back to directory").click()
    i = i+1;

答案 1 :(得分:0)

要迭代的项目列表包含WebElement。 click()一经触发,就会触发导航,使所有原始WebElement都失效(因为您已经离开了它们所附加的DOM)。

作为一种解决方法,您可以从元素中获取所有href网址,然后使用它们。由于它们不包含状态,因此您在哪个页面上都没有关系。因此,除了点击之外,您还可以执行以下操作:

elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#main table tr a")))
hrefs = [item.get_attribute("href") for item in elements if "#" not in item.get_attribute("href")]
for href in hrefs:
    driver.get(href)