有没有一种方法可以将硒等待实现为while语句?

时间:2020-10-30 11:31:26

标签: python selenium loops selenium-webdriver webdriverwait

我正在编写一个不断循环的脚本,当它检测到页面上某个元素中存在文本时,将需要停止该脚本。我在硒python文档中找不到有关此操作的任何帮助,但必须有一种方法。如果您仍然不明白我该怎么做,下面是一些代码:

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

编辑:我知道我要查找的元素的确切文本和确切xpath。但是,我只是在寻找一般的答复,因此我不介意缺少细节的答案。

5 个答案:

答案 0 :(得分:0)

您可以尝试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))

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

答案 1 :(得分:0)

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

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秒。这样,您的脚本就不会陷入无限循环中。

答案 2 :(得分:0)

要继续循环并在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

答案 3 :(得分:-1)

我正在用C#编写Selenium,但实际上并没有在while循环中使用它,但是我正在使用隐式等待来进行测试,直到我要查找的元素可用为止。该函数很容易编写,但是我不确定这是否对您有用。

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

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

答案 4 :(得分:-2)

尝试以下代码,这一定会对您有所帮助。

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..>>