【发布时间】:2017-01-29 13:48:56
【问题描述】:
在使用 selenium 的网站上执行自动化测试我遇到了这个问题,在网站的某个地方,当我的测试更改 DropDownList 的选择时,会抛出一个警报窗口,询问“你确定要离开这一页”。
根本问题是页面的刷新次数。当我寻找一个元素时:
Select sortingDropDownlist= new Select(webdriver.findElement(By.id("sortView")));
刷新页面需要一些时间,即使我没有更改任何内容。在这种情况下,thread.sleep(500) 将有助于防止弹出警报。
更改 DropDownList 后: sortDropDownlist.selectByValue("alpha");
列表后面的 onchange-javascript 尝试重新加载页面,而我的测试继续到 Then 部分验证新值。测试卡在那里,直到有人手动关闭警报窗口。我得到了错误:
org.openqa.selenium.WebDriverException: unknown error: cannot determine loading status
from unexpected alert open
(Session info: chrome=53.0.2785.116)
(Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Windows NT 6.3 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 43 milliseconds
Build info: version: '2.53.1', revision: 'a36b8b1', time: '2016-06-30 17:37:03'
System info: host: 'de-adn-bfxqp72', ip: '192.168.99.1', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_91'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={chromedriverVersion=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir=C:\Users\javadieh\AppData\Local\Temp\scoped_dir11488_27974}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=53.0.2785.116, platform=WIN8_1, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: b6e2d6fec84269128a420809f929916d
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...
一个简单但肮脏的解决方案是在更改选择后直接再次使用 Thread.sleep(500)。但是我对使用 thread.sleep 有一种不好的感觉。所以我正在寻找一个好的解决方案。
我也尝试了这个解决方案:在一个单独的线程中等待一个警报窗口出现,切换到它并关闭它。 但是......虽然警报窗口在那里,但我的线程没有找到它。这不是时间问题。这是我线程的代码:
public class AlertChecker extends Thread {
WebDriver webdriver=null;
WebDriverWait wait;
public AlertChecker(WebDriver webdriver) {
super();
this.webdriver = webdriver;
wait = new WebDriverWait(webdriver, 10);
}
public void run(){
System.out.println("MyThread running");
try {
wait.until(ExpectedConditions.alertIsPresent());
System.out.println("alert found");
Alert alert = webdriver.switchTo().alert();
alert.accept();
} catch (Exception e) {
//exception handling
System.out.println(e);
}
System.out.println("MyThread stopping");
}
}
如何等待页面刷新?
谢谢。
【问题讨论】:
-
控制台输出是什么? “MyThread 停止”打印出来了吗?
-
关闭警报窗口后(10 秒后),我得到:org.openqa.selenium.TimeoutException: Timed out after 10 seconds waiting for alert to be present ... MyThread 停止
-
您确定,您正在等待 javascript 警报吗??
-
实际上我发现了这个 wait.until(ExpectedConditions.alertIsPresent());在这里的一些条目中并使用它。我希望它正在等待 javascript 警报??
标签: multithreading selenium alert