让 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 的播放暂停和放大