在使用selenium的网站上进行自动化测试我遇到了这个问题,在网站的某个地方,当我的测试更改DropDownList的选择时,会抛出一个警告窗口询问"你确定你想离开这个页面"。
根本问题是页面的刷新时间。当我寻找元素时:
Select sortingDropDownlist= new Select(webdriver.findElement(By.id("sortView")));
即使我没有改变任何内容,页面也需要一些时间才能刷新。在这种情况下,thread.sleep(500)将有助于防止警报被激活。
更改DropDownList后: sortingDropDownlist.selectByValue("阿尔法&#34);
列表后面的onchange-javascript尝试重新加载页面,而我的测试继续到Then-part验证新值。测试卡在那里直到有人手动关闭警报窗口。我收到错误:
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");
}
}
我该如何等待页面刷新?
感谢。
答案 0 :(得分:0)
如果您获得JavaScript Alert
,请使用以下代码。
public static void isAlertpresent(WebDriver driver)
{
try
{
Alert window = driver.switchTo().alert();
String content = window.getText();
window.accept();
System.out.println("Alert Appeared & handeled : "+content );
}
catch (Exception e)
{
System.out.println("No Alert Appeared");
}
}
从您怀疑Alert
出现的位置调用此方法,
isAlertpresent(driver);
如果不是JavaScript Alert
,请尝试使用Window handling
技术来处理警报。