当使用 selenium 等待页面刷新后,webelement 的状态从初始值 "xxx" 更改为更改值 "yyy" 时如何处理?
How to tackle when the status of an webelement changes from initial value "xxx" to changed value "yyy" after the page refresh with selenium wait?
这是我试过的方法,但没有成功,
不确定我哪里出错了?
if (("xxx").equals(messageStatus)) {
FluentWait<WebDriver> wait = new FluentWait<WebDriver> (driver)
.withTimeout(90, TimeUnit.SECONDS)
.pollingEvery(500, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver webDriver) {
String messageStatus =
MessageLogPage.messageStatus.getText();
if (messageStatus.equals("yyy")){
MessageLogPage.receivedPresentation.click();
}
return null;
}
});
任何help/suggestions提前多appreciated.Thanks!
我认为问题可能在于,如果您的页面真正刷新,对 MessageLogPage.messageStatus
的旧引用将变得无效。 IE。不仅 messageStatus 文本发生了变化,元素实例本身也发生了变化。
所以我会更改算法以在每次获取元素之前获取它的文本。另外你不应该点击里面等待,在:
之后再做
wait.until(new ExpectedCondition<WebElement>() {
@Override public WebElement apply(WebDriver webDriver) {
try {
WebElement element = webDriver.findElement(By.<...>); // however you can locate MessageLogPage.messageStatus
if(element.getText().equals("yyy")) {
return element;
}
}
catch(Exception e) { } // keep going (retun null)
return null;
});
wait.until
会多次调用这个函数,直到 return 值不为 null 或超时已过,在这种情况下它会抛出异常。所以 wait.until
之后的下一行可以是点击:
wait.until(...); // above code
MessageLogPage.receivedPresentation.click(); // we are here only if wait.until did not throw the exception
虽然有可能MessageLogPage.receivedPresentation
如果页面刷新也可能无效
您甚至可以通过 returning Boolean
进一步简化它,因为您在找到它后并不真正关心这个元素:
wait.until(new ExpectedCondition<Boolean>() {
@Override public Boolean apply(WebDriver webDriver) {
try {
WebElement element = webDriver.findElement(By.<...>); // however you can locate MessageLogPage.messageStatus
return element.getText().equals("yyy");
}
catch(Exception e) { } // keep going (return false)
return false;
});
这是我试过的方法,但没有成功,
不确定我哪里出错了?
if (("xxx").equals(messageStatus)) {
FluentWait<WebDriver> wait = new FluentWait<WebDriver> (driver)
.withTimeout(90, TimeUnit.SECONDS)
.pollingEvery(500, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver webDriver) {
String messageStatus =
MessageLogPage.messageStatus.getText();
if (messageStatus.equals("yyy")){
MessageLogPage.receivedPresentation.click();
}
return null;
}
});
任何help/suggestions提前多appreciated.Thanks!
我认为问题可能在于,如果您的页面真正刷新,对 MessageLogPage.messageStatus
的旧引用将变得无效。 IE。不仅 messageStatus 文本发生了变化,元素实例本身也发生了变化。
所以我会更改算法以在每次获取元素之前获取它的文本。另外你不应该点击里面等待,在:
之后再做 wait.until(new ExpectedCondition<WebElement>() {
@Override public WebElement apply(WebDriver webDriver) {
try {
WebElement element = webDriver.findElement(By.<...>); // however you can locate MessageLogPage.messageStatus
if(element.getText().equals("yyy")) {
return element;
}
}
catch(Exception e) { } // keep going (retun null)
return null;
});
wait.until
会多次调用这个函数,直到 return 值不为 null 或超时已过,在这种情况下它会抛出异常。所以 wait.until
之后的下一行可以是点击:
wait.until(...); // above code
MessageLogPage.receivedPresentation.click(); // we are here only if wait.until did not throw the exception
虽然有可能MessageLogPage.receivedPresentation
如果页面刷新也可能无效
您甚至可以通过 returning Boolean
进一步简化它,因为您在找到它后并不真正关心这个元素:
wait.until(new ExpectedCondition<Boolean>() {
@Override public Boolean apply(WebDriver webDriver) {
try {
WebElement element = webDriver.findElement(By.<...>); // however you can locate MessageLogPage.messageStatus
return element.getText().equals("yyy");
}
catch(Exception e) { } // keep going (return false)
return false;
});