【问题标题】:Is there a way to implement selenium waits into a while statement?有没有办法将硒等待变成一个while语句?
【发布时间】:2020-10-30 11:31:26
【问题描述】:

我正在编写一个不断循环的脚本,当它检测到页面上的某个元素中有文本时需要停止。我在 selenium python 文档中找不到任何关于这样做的帮助,但必须有办法。如果你仍然不明白我需要做什么,这里有一些代码:

While #element is not visible:
   #do stuff
#when element is visible break out of statement and do something else

编辑:我知道我正在寻找的元素的确切文本和确切 xpath。但是,我只是在寻找一般性的回答,所以我不介意缺少细节的答案。

【问题讨论】:

  • 您的问题不太清楚。你知道哪个元素应该包含文本吗?你知道全文还是只知道部分?等待所需文本需要多长时间?为您的问题添加更多详细信息
  • @JaSON 好的,我会编辑
  • 请看一下这个问题:Similar Problem

标签: python selenium loops selenium-webdriver webdriverwait


【解决方案1】:

您可以尝试text_to_be_present_in_element 预期条件并执行ExplicitWait 如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get(URL)

timeout = <SET MAXIMUM AMOUNT OF TIME IN SECONDS TO WAIT> 
your_text = '<REQUIRED TEXT>'

element = WebDriverWait(driver, timeout).until(EC.text_to_be_present_in_element((By.ID, "<ElementID>"), your_text))

这将在所需文本出现后立即返回元素

【讨论】:

  • OP 的代码显示他想在循环时执行一些代码。这种方法不允许这样做。
【解决方案2】:

下面的代码将获取所需的元素,然后循环直到显示(可见)。在循环结束时,您可能需要重新获取元素(以防页面更改),然后再检查它是否显示在循环顶部。

element = driver.find_element_by_XXX(locator)
while not element.is_displayed():
    #do stuff
    element = driver.find_element_by_XXX(locator)
#when element is visible break out of statement and do something else

我还要补充一点,你可能想要一个循环转义,以防元素永远不可见。您可以通过在进入循环之前获取当前时间然后检查while 条件来检查以确保它自开始时间以来不超过30 秒。这样你的脚本就不会陷入死循环。

【讨论】:

    【解决方案3】:

    要继续循环并在Selenium 检测到页面上的某个元素中有文本时停止,您可以使用以下Locator Strategy

    while True:
        try:
            WebDriverWait(driver, 5).until(EC.invisibility_of_element((By.XPATH, "element_xpath")))
            #do stuff
            continue
        except:
            break
    #do something else
    

    【讨论】:

      【解决方案4】:

      我正在 C# 中为 Selenium 编写代码,并且从未在 while 循环中实际使用过它,但我使用隐式等待使我的测试等到我正在寻找的元素可用。该函数很容易编写,但我不确定这是否适合您。

      _ = driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
      

      基本上,Selenium 会等待直到元素可用或总共 30 秒,然后如果元素不可用,则测试失败。

      【讨论】:

      • 这不是这段代码的作用。您发布的代码将驱动程序实例的一次性超时设置为 30 秒。一遍又一遍地调用它实际上并没有做任何事情。当您调用它时,它实际上并没有等待。根据 Selenium 贡献者的说法,隐式等待也是一种不好的做法。
      • 此评论也不在 Python 中,根据帖子,这是 OP 正在使用的语言
      【解决方案5】:

      试试下面的代码,一定会对你有所帮助。

      from selenium import webdriver
      
      driver = webdriver.Chrome(executable_path=r'/path/chromedriver')
      driver.get('https://example.com')
      condition = driver.find_element_by_<METHOD>('<|Element|>')
      while not condition:
           <<..yourWork..>>
      

      【讨论】:

      • 此代码没有考虑到 OP 要求的内容......而元素不可见则做事。您的“条件”检查是否为空,不可见。
      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多