我有一个测试在Jenkins内部运行时总是失败。
我的项目包括Selenium网络驱动程序、JAVA、Maven、TestNG、Jenkins、Allure(报告(。我有几个测试套件,包含100多个测试用例,我通过3个不同的浏览器对它们进行迭代(测试使用TestNG并行运行(。它们都运行(使用maven命令行(并在我的开发笔记本电脑中传递,使用命令行时在测试服务器上传递。
我有两个关于Jenkins的问题,并将它们分为两个问题——其中一个问题在本问题中描述,另一个问题(IE11问题(在这里。
当在测试服务器的Jenkins内部运行时,问题就开始了!测试在移动模拟器(Chrome浏览器(中失败-在测试中,我点击一个链接来验证是否使用正确的url打开了一个新窗口。我尝试了3种类型的点击(Selenium点击、Actions、JS(,但都返回了一个null句柄。
代码:
在这里我创建了主窗口句柄并点击链接:
String mwh = driver.getWindowHandle();
WebElement poweredBy = (new WebDriverWait(driver,10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath(Consts.POWERED_BY_XPATH_1000))));
poweredBy.click();
这是获取句柄并验证新窗口的方法的一部分:
public boolean closePopupWindow(String mwh, String mTitle, String layoutNumber) {
// For IE11- make sure popup blocker is turned off in the options. else it will have only one window handle and fail
boolean isOpenedWindowCorrect = false;
String newWindow = null;
Set<String> handlers = driver.getWindowHandles();
for (String window : handlers) {
if (!window.equals(mwh)) {
newWindow = window;
}
}
// the focus is on the main page. need to switchTo new page and close it
driver.switchTo().window(newWindow);
System.out.println("The focus now is on the NEW window");
String newTitle = driver.getTitle();
System.out.println(newTitle);
这是我得到的错误:
java.lang.NullPointerException:条目中的null值:handle=null网址:com.google.common.collect.CollectPreconditions.checkEntryNotNull(CollectPrecondients.java:34(网址:com.google.common.collect.SingletonImmutableBiMap.(SingletonImutableBiMap.java:42(网址:com.google.common.collect.ImmutableBiMap.of(ImmutableBiMap.java:73(网址:com.google.common.collect.ImutableMap.of(ImmutableMap.java:123(位于org.openqa.selene.remote.RemoteWebDriver$RemoteTargetLocator.window(RemoteWebDriver.java:995(在il.carambola.pages.Page.closePopupWindow(Page.java:786(
Jenkins不会在浏览器中打开新窗口,你认为这是安全问题吗?打开窗户很慢吗?当不使用移动模拟器时,同样的测试通过。(我在Chrome和Firefox中进行了相同的测试,点击成功并通过了验证(。
JDK 1.8.0_162
Jenkins V 2.121.1
服务器-AWS t2.large-8GB RAM,Windows服务器2016数据中心,64位
很明显,当您的程序到达这一行时
driver.switchTo().window(newWindow);
则CCD_ 1仍然为空。按照这种方式写,这可能是一个时间问题,也可能是另一个导致弹出窗口不显示的问题。为了确保这不是时间问题,我建议在尝试切换窗口之前,添加一些等待多个窗口句柄的方法。类似的东西
(new WebDriverWait(driver,10)).until(d -> d.getWindowHandles().size() == 2);
如果等待失败,那么你就知道弹出窗口被阻止了,可以从那里开始。