首页 > 解决方案 > 如何改进用于解析链接的 python 脚本?

问题描述

我编写了一个测试,它解析来自网页的链接,并在循环中单击每个链接,然后返回主页。但是每次迭代都伴随着一次又一次地解析整个网页并覆盖链接数组,尽管每次迭代只需要一个链接。我知道这是低效的。我该如何优化呢?

我尝试只解析一次链接,然后循环遍历它们。在第一次迭代之后,它返回(到主页)并尝试单击第二个链接,但它不是交互式的(我认为这是因为存储在 links 数组中的 web 元素每次你去页)。

def setUp(self):
    self.driver = webdriver.Chrome()
    self.driver.get('https://yandex.ru')

def test_01(self): 
    driver = self.driver
    links = []
    time.sleep(3)
    links = driver.find_elements_by_css_selector("a")
    for i in range(len(links)):
        links = driver.find_elements_by_css_selector("a")
        links[i].click()
        driver.get('https://yandex.ru')
        time.sleep(3)

我期待更有效的解决方案。

标签: pythontestingselenium-webdriverautomated-tests

解决方案


  1. 当您离开页面时,WebElements会随着DOM的变化而失效,因此我建议您使用List Comprehension并将 WebElements 列表转换为链接文本列表。
  2. 完成后,您应该能够使用normalize-text()函数,以防文本属于子元素或具有开始/尾随空格
  3. 最后但并非最不重要的一点是考虑使用显式等待,以防万一链接是通过AJAX调用填充的。

示例代码:

driver.get("http://yandex.ru")
links = [link.text for link in driver.find_elements_by_css_selector("a")]
for link in links:
    WebDriverWait(driver, 10) \
        .until(expected_conditions
        .presence_of_element_located(
        (By.XPATH, "//a[normalize-space()='" + link + "']"))).click()
    # do what you need here
    print(driver.title)
    driver.back()
driver.quit()

推荐阅读