问题 让Selenium暂停X秒


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

我已经拥有的代码是

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秒?


2937
2017-11-15 19:37


起源

查看这篇文章: stackoverflow.com/questions/5868439/... - Gayathri


答案:


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

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

7
2017-11-16 16:04



仅举这一点,在这种方法中,ExpectedCondition每隔500ms进行一次测试,以查看条件是否满足(此处“ID”元素可见)直到超时(此处设置为10)。对于自定义谓词,也可以编写自己的条件。有关此文档,请访问: seleniumhq.org/docs/04_webdriver_advanced.jsp - anotherdave


那不是真正的硒特定事物。您只是希望java在加载页面后但在拍摄屏幕截图之前暂停一下。

Thread.sleep(4000);

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


6
2017-11-15 19:44



唯一的原因我不赞成是因为你应该 决不.....使用像这样的显式等待。坏。 - sircapsalot
因此,如果他在1000个套件中的每个测试中截取屏幕截图,并且该元素通常会在500毫秒后加载,这种方法会增加一小时的构建时间。 - anotherdave
@sircapsalot如果我希望我的浏览器在关闭之前保持打开额外的2秒(我打电话给.Quit()),我应该怎么做? - MStodd
对不起 - 使用Thead.sleep进行了投票。总有其他解决方案,例如条件等待等 - sashok_bg


万一它会帮助某人,你应该总是尽量避免隐含的等待,特别是 Thread#sleep 尽你所能地。如果你这样做 Thread.sleep(10),你的代码会 总是 等待10秒钟,即使您的页面在1秒后准备就绪。因此,如果您经常使用它,这可能会大大减慢您的测试速度

更好的方法是使用 ExplicitWaits 你的意思是,只要某些动作发生或某些元素在页面上呈现,你就会等待。所以在你的情况下,我会使用显式等待检查是否所有内容都加载,然后截取屏幕截图。


2
2017-11-16 12:25



感谢您使用ExplicitWaits链接,真的很有帮助! :) - Tzach Solomon


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

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

资源


1
2018-06-16 18:28