让 Selenium 暂停 X 秒

Posted

技术标签:

【中文标题】让 Selenium 暂停 X 秒【英文标题】:Getting Selenium to pause for X seconds 【发布时间】:2013-11-29 07:49:44 【问题描述】:

我想要完成的是浏览一个页面,等待加载某些内容,然后截取并保存屏幕截图。

我已有的代码是

WebDriver driver = new FirefoxDriver();


driver.get("http://www.site.com");


driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

try 

    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(scrFile, new File("/home/Desktop/image.png"));

 catch (Exception e)  

       e.printStackTrace(); 


driver.close();

即使页面已加载,我也需要等待的原因是因为它将被加载,但在网站上我想在几秒钟后拍摄加载图片的内容。由于某种原因页面没有等待,我可以使用另一种方法来让驱动程序/页面等待 X 秒吗?

【问题讨论】:

查看这篇文章:***.com/questions/5868439/… 【参考方案1】:

那真的不是硒特有的东西。你只是想让java在加载页面之后但在截屏之前休眠一下。

Thread.sleep(4000);

把它放在你的 driver.get 语句之后。

【讨论】:

因此,如果他在 1,000 个套件中的每个测试中截取屏幕截图,并且元素通常会在 500 毫秒后加载,那么这种方法会增加一个小时的构建时间。 @sircapsalot 如果我希望我的浏览器在关闭前多保持打开 2 秒(我调用 .Quit()),我应该怎么做? 抱歉 - 因使用 Thead.sleep 而被否决。总是有其他的解决方案,比如条件等待等等【参考方案2】:

以防万一它对某人有所帮助,您应该始终尽量避免隐式等待,尤其是Thread#sleep。如果您执行Thread.sleep(10),您的代码将始终等待 10 秒,即使您的页面在 1 秒后准备就绪。因此,如果您经常使用它,这会大大减慢您的测试速度。

更好的方法是使用ExplicitWaits,这意味着只要发生​​某些操作或某些元素在页面上呈现,您就会一直等待。因此,在您的情况下,我会使用显式等待来检查是否所有内容都已加载,然后截屏。

【讨论】:

感谢您提供 ExplicitWaits 链接,真的很有帮助! :)【参考方案3】:

您可以找到在初始页面加载后加载的元素,然后让 Selenium 等到找到该元素。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ID")));

【讨论】:

顺便提一下,在这种方法中,ExpectedCondition 每 500 毫秒测试一次,以查看条件是否满足(此处“ID”元素可见)直到超时(此处设置为 10) .也可以为自定义谓词编写自己的条件。此处提供相关文档:seleniumhq.org/docs/04_webdriver_advanced.jsp【参考方案4】:

如果你想延迟一定的秒数,而不是尽快响应,这里有一个类似于 selenium IDE 提供的暂停功能:

public void pause(Integer milliseconds)
    try 
        TimeUnit.MILLISECONDS.sleep(milliseconds);
     catch (InterruptedException e) 
        e.printStackTrace();
    

source

【讨论】:

【参考方案5】:
const  By, until  = require('selenium-webdriver');


this.wait = async function (amount: number) 
      try 
        await this.driver.wait(
          until.elementLocated(By.css('[data-test-id="does-not-exist"]')),
          amount,
          'Looking for element'
        );
       catch (e) 
        console.log('waiting')
      

我们寻找一个在 x 秒内不存在的 CSS 标识符。这是打字稿顺便说一句。这将是某个相关类的方法,或者本身是一个函数。像这样使用它

  const button = await this.findByCSSSelector('[data-test-id="get-quote-button"]')
  const actions = this.driver.actions( bridge: true ); 
  await actions.move(origin: button ).perform();

  // Small pause to observe animation is working correctly in all browsers
  await this.wait(700)

  const carat = await this.findByCSSSelector('[data-test-id="carat"]');

这会等待 0.7 秒,以便您可以看到在您的功能测试中运行的任何动画。

【讨论】:

但是在java中被问到了!【参考方案6】:

最简单的。

试试这个,忘记休息!此代码的等价物可用于任何语言。 我正在用python写这个。

import time
time.sleep(2)

这将使编译器休眠 2 秒。

【讨论】:

以上是关于让 Selenium 暂停 X 秒的主要内容,如果未能解决你的问题,请参考以下文章

selenium : 不能自动化 youtube 的播放暂停和放大

显示进度条时如何暂停 Selenium 执行

Selenium自动化测试-设置元素等待

如何让R执行暂停,休眠,等待X秒?

如何在使用 Selenium 自动执行测试时处理在调试器中暂停的覆盖

如何让Mink Selenium 2 Driver等待页面加载Behat