我试图等待WebElement从空白变为消息1,然后是消息2。问题是我每次都找到第一条消息,但我似乎永远无法等待第二条消息(它超时寻找文本)
我已经尝试过将不起作用的等待对象分开。我尝试了一些预期的条件方法(text ToBePresent*),在阅读了一些之后(我发现了刷新的EC)无济于事。
@FindBy(xpath="//p[@class='statusText']")
WebElement statusMsg
public WebElement statusMsg(){
String msg1="Logging in, please wait."
String msg2="Login successful, please wait."
String msg3="Login attempt exception, error code: "
if(statusMsg.getText().contains(msg3)){
log.error(statusMsg.getText())
log.error("Something happened in the frontend")
Assert.fail(statusMsg.getText())
}else{
log.info(statusMsg.getText())
}
WebDriverWait wait = new WebDriverWait(driver,45)
wait.until(ExpectedConditions.textToBe(By.xpath("//p[@class='statusText']"), msg1))
if(statusMsg.getText().contains(msg3)){
log.error(statusMsg.getText())
log.error("Something happened in the backend")
Assert.fail(statusMsg.getText())
}else{
log.info(statusMsg.getText())
}
wait.until(ExpectedConditions.refreshed(ExpectedConditions.textToBe(By.xpath("//p[@class='statusText']"), msg2)))
log.info("Found: "+msg2)
return statusMsg
}
结果是testNG没有通过我的测试,我说:
组织。openqa。硒。TimeoutException:预期条件失败:等待条件(由.xpath://p[@class='statusText']找到的元素)显示文本“登录成功,请稍候”。当前文本:“正在登录,请稍候。”)
然而,在测试运行时,我可以看到msg2。是否必须这样做,因为我已经通过PageFactory初始化了页面对象。initElements(驱动程序,this)?
以下代码可用于按顺序检查错误和成功消息。逻辑:
WebDriverWait wait = new WebDriverWait(driver, 20);
String errorMessage = "Login attempt exception, error code:";
List<String> expectedMessages = Arrays.asList(
"Logging in, please wait.",
"Login successful, please wait.");
wait.pollingEvery(Duration.ofMillis(50))
.withMessage(String.format("Expecting %s login messages", expectedMessages))
.until(d -> {
if (!d.findElement(By.xpath("//p[@class='statusText']")).isDisplayed())
return false;
String actualMessage = d.findElement(By.xpath("//p[@class='statusText']")).getText();
if (actualMessage.contains(errorMessage))
Assert.fail(actualMessage);
String expectedMessage = expectedMessages.get(0);
if (expectedMessage.contains(actualMessage)) {
log.info(String.format("Message \"%s\" found", actualMessage));
expectedMessages.remove(expectedMessage);
}
return expectedMessages.size() == 0;
});
第二种解决方案是在检查之后获取所有消息
使用下面的代码获取所有消息并检查您从网站获得的内容:
JavascriptExecutor js = (JavascriptExecutor) driver;
List<String> actualMessages = new ArrayList<>();
for (int i = 0; i < 30000; i++) {
actualMessages.addAll(
(ArrayList<String>) js.executeScript("return [...document.querySelectorAll('p.statusText')].map(e=>{return e.textContent})")
);
Thread.sleep(10);
}
// debug here to check message collected
System.out.println(actualMessages);
本文向大家介绍Selenium有哪些不同的等待类型?,包括了Selenium有哪些不同的等待类型?的使用技巧和注意事项,需要的朋友参考一下 下面列出了Selenium中可用的不同类型的等待- 隐式等待 这是Selenium中动态等待的一种,其语法为- 明确等待 这是Selenium中动态等待的一种,其语法为- 流利的等待 这是Selenium中动态等待的一种,其语法为- 静态等待 这用于将执行暂停
问题内容: 有没有一种方法可以使存根方法在后续调用中返回不同的对象?我想这样做是为了测试来自的不确定响应。即,不管方法的返回顺序如何进行测试,结果都保持恒定。 我要测试的代码看起来像这样。 问题答案: 你可以使用方法来做到这一点(与链接时): 或使用等效的静态doAnswer方法:
...NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:映射到HTTP路径的处理程序方法不明确...
问题内容: 如果类路径中有两个JAR文件,两个文件的根中都包含一个名为“ config.properties”的资源。有没有办法检索类似于的 两个 文件?顺序不相关。 一种替代方法是,如果可能的话,在类路径中加载与某些条件匹配的每个属性文件。 问题答案: 您需要 (或静态版本)。 但是不幸的是,资源不在“目录”中存在一个已知问题。例如,可以,但是可能是一个问题。在Spring Reference中
问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一