【问题标题】:Loop through links using Selenium Webdriver (Python)使用 Selenium Webdriver (Python) 循环链接
【发布时间】:2014-03-10 19:30:11
【问题描述】:

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

【问题讨论】:

    标签: python selenium webdriver


    【解决方案1】:

    我不确定这是否能解决问题,但通常最好使用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()
    
    1. 点击链接后,应等到链接的url 加载。所以对wait.until的调用直接放在link.click()之后
    2. 而不是使用

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

      最好用

      for link in list_of_links: 
      

      一方面,它提高了可读性。而且,你真的不 需要关心号码x,你真正关心的是 循环遍历链接,这就是 for-loop 所做的。

    【讨论】:

    • 啊啊啊,在 WebDriverWait 上理解。试过了,但行为仍然和以前一样。从逻辑上讲,它应该在 li 项中正确迭代。诚然,我很容易错过一些东西。我会粘贴我的 shell 输出,但恐怕我有字符限制。奇怪的是,它看起来完全忽略了等待,然后点击......我不确定它点击的是什么 div,但它不是它应该是的那个。
    • 该 URL 是否可公开访问?如果有的话,贴出来,我试试看。
    • 不幸的是,这不是新行为!一旦我弄清楚 cmets 中的代码格式,无论如何......在while循环中使用上面的for循环(为列表项增加x),它甚至没有增加......但它正在将初始页面上的标题打印到文件 30 次,所以它显然要循环 30 次。 (哦,对 Python Selenium 都是新手的好处...)
    • 所以:while x &lt;= link_count: for element in list_of_links: link=driver.find_element... link.click text=wat.until... textsave.write driver.back() x+=1 textsave.close() 正在吐出同一行的 30 行(我......在 cmets 中的代码格式真的失败了,对不起:/)
    • 我对帖子进行了更改。它展示了如何使用for-loop 而不是while-loop。您不应该同时使用两者,在这种情况下,for-loop 被认为更“Pythonic”。还要确保您调用的是link.click()(带括号)而不仅仅是link.click。括号告诉 Python 调用该函数。没有括号,表达式的计算结果为函数对象本身。
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多