首页 文章

使用Selenium Webdriver(Python)循环链接

提问于
浏览
3

下午全部 . 目前正在尝试使用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 /自动化,因为我只是进入了两者 . 提前致谢!!

1 回答

  • 3

    我不确定这是否能解决问题,但一般情况下最好使用 WebDriverWait 而不是 implicitly_wait ,因为WebDriveWait.until将继续调用提供的函数(例如 driver.find_element_by_xpath ),直到返回的值不是 False -ish或超时(例如达到了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()
    
    • 单击该链接后,应该等到链接的URL加载完毕 . 所以 wait.until 的调用直接放在 link.click() 之后

    • 而不是使用

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

    最好使用

    for link in list_of_links:
    

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

相关问题