使用Selenium Webdriver(Python)遍历链接
大家下午好。目前我正在尝试使用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
更好。因为 WebDriverWait.until 会不断调用你提供的函数(比如 driver.find_element_by_xpath
),直到返回的值不是 False
或者超时(比如 5000 秒)为止——到那时,它会抛出一个 selenium.common.exceptions.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()
- 在你点击链接后,应该等到链接的网页加载完成。所以
wait.until
的调用应该紧跟在link.click()
之后。 与其使用
while x <= link_count: ... x += 1
不如使用
for link in list_of_links:
这样做有一个好处,就是让代码更容易读懂。而且,你其实不需要关心数字
x
,你真正关心的是遍历这些链接,这正是for-loop
所做的事情。