【问题标题】:I need to set up a for loop to click on several links and then go back to the previous page我需要设置一个for循环来点击几个链接,然后返回上一页
【发布时间】:2018-07-10 10:34:48
【问题描述】:

这是我的一段代码:

my_list = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@border='1']//a")))
for option in my_list:
    option.click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='Javascript:history.go(-1)']"))).click() #to go back to the initial page

我正在使用它们共同的 xpath 从表中选择 10 个不同的链接,然后,对于每个链接,我想首先单击它,然后返回到上一页上的表。问题是程序在第一次迭代时停止。我能做什么?

【问题讨论】:

  • IMO,网页上没有//table[@border='1']这样的元素。请编辑您的问题并询问实际问题。你想做什么?
  • @Debanjan 我不在主页上工作(那是链接带给你的),xpath 指的是我工作的 html,我不知道如何发送给你,因为当我深入网站时,网址永远不会改变(这就是我想通过让您自己尝试将链接放在这里的可能性来展示的)
  • 啊哈,在这种情况下,如果您可以使用相关的 HTML 更新问题,那么志愿者将更容易构建一个经过充分研究的答案。

标签: python-3.x selenium for-loop selenium-webdriver automation


【解决方案1】:

你可以试试下面的代码:

my_list_length = len(WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@border='1']//a"))))
for index in range(my_list_length):
    WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@border='1']//a")))[index].click()
    driver.back() #to go back to th initial page

【讨论】:

  • :我认为它会提供陈旧的元素参考,一旦您返回点击第二个链接。
  • 没有。这种方法正是为了避免StaleElementReferenceException。请注意,每次迭代都会重新定义列表
  • 我运行了它,但它仍然给我“TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:”,问题出在代码的第 3 行。也许知道无论您单击什么页面的 url 都保持不变(如果您想检查,该站点是 coeweb.istat.it)会有所帮助,所以就像我只是在同一页面内来回移动(按下按钮“返回”可能会返回到同一页面)
  • 所以是单页应用?它会在第一次迭代中失败吗?不幸的是,我无法访问提到的 URL。你可以试试driver.refresh() 代替driver.back() 吗?
  • 我认为是,但我不熟悉术语抱歉。不幸的是,“刷新”它会返回单击几下并删除我设置的所有选项,因此它可能会起作用,但效率会非常低,因为我必须从头开始选择所有内容并浪费许多代码行。用“back”代替它到达与我的初始代码相同的点,这意味着它在第一次迭代后停止(完成它,这样我就回到了我想要的地方,但它只是停在那里)
【解决方案2】:

@Andersson 的回答可能会满足您当前的问题,但根据最佳实践,您可以考虑以下附加点:

  • 理想情况下,当您引诱服务员并继续前进时,您单击应该调用 element_to_be_clickable 的元素,但是当您从列表中调用索引元素时,您必须退回到 visibility_of_all_elements_located .
  • 要浏览回到上一页而不是在 基本 url 上调用 back() 方法 get() 方法
  • 您修改后的代码将是:

    custom_url = driver.current_url
    length = len(WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@border='1']//a"))))
    for item in range(length):
        WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@border='1']//a")))[item].click()
        # perform your tasks and browse back to the base_url
        driver.get(custom_url)
    

【讨论】:

  • 我运行它并得到“TypeError:'WebElement'对象不支持索引”。也许知道无论您单击什么页面的 url 都保持不变(如果您想检查,该站点是 coeweb.istat.it),这会有所帮助,所以就像我只是在同一页面内来回移动(按按钮“返回”也许可以返回到同一页面)。出于这个原因,我不确定“driver.get(base_url)”会起作用,因为我认为它会将我重定向到主页
  • @LorenzoMussetti 试试我更新的答案,让我知道状态。
  • 当我用“driver.refresh()”而不是“driver.back()”尝试安德森的回答时,它发生了同样的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多