python - 使用 Selenium Webdriver (Python) 循环访问链接

标签 python selenium webdriver

下午好。目前正在尝试使用 Selenium webdriver 循环访问页面上的链接列表。具体来说,它是单击一个链接,从所述页面上抓取一行文本以写入文件,然后返回,然后单击列表中的下一个链接。以下是我所拥有的:

    def test_text_saver(self):
    driver = self.driver
    textsave = open("textsave.txt","w")
    list_of_links = driver.find_elements_by_xpath("//*[@id=\"learn-sub\"]/div[4]/div/div/div/div[1]/div[2]/div/div/ul/li")
    """Initializing Link Count:"""
    link_count = len(list_of_links)
    while x <= link_count:
        print x
        driver.find_element_by_xpath("//*[@id=\"learn-sub\"]/div[4]/div/div/div/div[1]/div[2]/div/div/ul/li["+str(x)+"]/a").click()
        text = driver.find_element_by_xpath("//*[@id=\"learn-sub\"]/div[4]/div/div/div/div[1]/div[1]/div[1]/h1").text
        textsave.write(text+"\n\n")
        driver.implicitly_wait(5000)
        driver.back()
        x += 1
    textsave.close()

运行时,它会转到初始页面,然后...返回到主页,而不是它应该返回的子页面。打印 x,我可以看到它递增了三倍而不是一倍。之后它也会崩溃。我已经检查了我所有的 xpath 等,并确认它得到了列表中链接数量的正确计数。

非常感谢任何输入——这实际上只是为了展示我的 python/自动化,因为我刚刚接触到两者。提前致谢!!

最佳答案

我不确定这是否会解决问题,但一般来说,使用 WebDriverWait 而不是 implicitly_wait 更好,因为 WebDriveWait.until将继续调用提供的函数(例如 driver.find_element_by_xpath)直到返回值不是 False 或达到超时(例如 5000 秒)——此时它会引发 selenium.common.execptions.TimeoutException

import selenium.webdriver.support.ui as UI

def test_text_saver(self):
    driver = self.driver
    wait = UI.WebDriverWait(driver, 5000)
    with open("textsave.txt","w") as textsave:
        list_of_links = driver.find_elements_by_xpath("//*[@id=\"learn-sub\"]/div[4]/div/div/div/div[1]/div[2]/div/div/ul/li/a")
        for link in list_of_links:  # 2
            link.click()   # 1
            text = wait.until(
                lambda driver: driver.find_element_by_xpath("//*[@id=\"learn-sub\"]/div[4]/div/div/div/div[1]/div[1]/div[1]/h1").text)
            textsave.write(text+"\n\n")
            driver.back()
  1. 点击链接后,您应该等到链接的网址是 加载。所以对 wait.until 的调用直接放在 link.click()
  2. 之后
  3. 而不是使用

    while x <= link_count:
        ...
        x += 1
    

    更好用

    for link in list_of_links: 
    

    有人认为,它提高了可读性。而且,你真的不 需要关心数字x,你真正关心的是 遍历链接,这就是 for-loop 所做的。

关于python - 使用 Selenium Webdriver (Python) 循环访问链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22309502/

相关文章:

python - 如何从我的数据框列中删除 u-unicode 字符,该列是由字典组成的字符串?

python - 计算第一行第一列输入的数组值

java - (JAVA) 如何在 AWT.Frame 中添加 selenium webdriver 窗口以使用 Action Listeners

java - 当 findElement 方法无法识别可用属性时,如何定位 WebElement?

python - 在Python中使用etree解析XML

python - PyQt Designer 在哪里写代码?

java - 如何在多个类上 initElements ?

java - Selenium WebDriver 可以访问 Google Drive 上的文件吗?

c# - 是否可以在不安装 Selenium Server 的情况下使用 ISelenium/DefaultSelenium?

python - selenium.webdriver.firefox.options - 它是关于什么的?