【问题标题】:How can I improve my python script for parsing links?如何改进用于解析链接的 python 脚本?
【发布时间】:2019-09-14 20:08:12
【问题描述】:

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

我尝试只解析一次链接,然后循环遍历它们。在第一次迭代之后,它返回(到主页)并尝试单击第二个链接,但它不是交互式的(我认为这是因为存储在 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)

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

【问题讨论】:

  • 如果代码有效,您应该在Code Review询问
  • 以字符串形式获取链接并使用driver.get(link) 而不是click。然后您甚至不必返回主页。

标签: python testing selenium-webdriver automated-tests


【解决方案1】:
  1. 当您离开页面时,WebElements 会因DOM 更改而失效,因此我建议您使用List Comprehension 并将WebElements 列表转换为链接文本列表。
  2. 完成后,您应该可以使用normalize-text() 函数,以防文本属于子元素或有开头/结尾空格
  3. 最后但并非最不重要的一点是考虑使用Explicit Wait,以防万一链接通过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()

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多