我在使用MicrosoftEdge运行selenium测试时等待元素可见的功能出现问题。特别是当元素位于另一个元素之上时。有谁知道如何解决这个问题?是否有一个javascript函数,我可以用来确保用户看到该元素并可以点击它?
这是我现在使用的
function waitForElementDisplay (selector, time) {
if (document.querySelector(selector) != null) {
return true;
}
else if (timeLimit < timeSince) {
return false;
}
else {
timeSince += time;
setTimeout(function () {
waitForElementDisplay(selector, time, timeLimit, timeSince);
}, time);
}
}
答案 0 :(得分:0)
是的,有时候硒确实有问题。从未使用Edge,但与其他浏览器有类似的问题。
我通常做的是编写重试包装然后使用 脚本执行器中的“document.getElementById”(或其他东西),以在脚本执行器中获取元素引用。我尝试了几次X秒延迟。
以下java中的示例显示了我如何在DOM中等待某些元素可访问。 (我正在使用cucumberJVM)
@When("^questionnaire response is loaded$")
public void questionnaire_response_is_loaded() throws Throwable {
Predicate<WebDriver> isLoaded = new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver webDriver) {
Object obj = ((JavascriptExecutor) webDriver).executeScript(
"return (!document.getElementById('idNotification'))"
);
// if element is present the result will turn false, so we have to negate it
return !((Boolean) obj);
}
};
WebDriverWait wait = new WebDriverWait(BrowserDriver.getCurrentDriver(), 10);
wait.until(isLoaded);
}
答案 1 :(得分:0)
方法waitForElementVisible
仅检查元素是否以大于0的大小和不透明度进行渲染。它不会检查元素是否可被人眼看到。
您可以使用此JavaScript函数检查元素是否可见且可点击:
function isClickable(element) {
var doc = element.ownerDocument || document,
win = doc.defaultView || window,
rect = element.getBoundingClientRect(),
elemAt = doc.elementFromPoint(rect.left + (rect.width >> 1), rect.top + (rect.height >> 1));
for (var e = elemAt; e; e = e.parentElement) {
if (e === element) return !elemAt.disabled && win.getComputedStyle(elemAt, null).getPropertyValue('pointer-events') !== 'none';
}
return false;
}
请注意,如果元素未滚动到视图中,它将返回false。因此,您可能需要先致电element.scrollIntoView()
。