我一直在研究现有的Selenium自动化框架,在该框架中有一个代码可以检查元素的宽度和高度。如果它们仅具有正值,则可以交互,例如单击,双击等。
public boolean isElementInteractable(WebElement element) {
JavascriptExecutor js = (JavascriptExecutor) driver;
String offsetWidth = js.executeScript("return arguments[0].offsetWidth;", element).toString();
String offsetHeight = js.executeScript("return arguments[0].offsetHeight;", element).toString();
if ((Integer.parseInt(offsetWidth) != 0 && Integer.parseInt(offsetHeight) != 0) && element.isDisplayed()) {
return true;
}
return false;
}
据我了解,每个可见/可交互的元素的高度和宽度都是正的。我很困惑为什么要编写此代码。
请您确认我的理解是否正确?如果没有,请帮助我了解可能的情况。
答案 0 :(得分:1)
WebElement
必须具有宽度和高度以便于处理,但是在两种情况下可以视为可见:笔画宽度为正,或者子节点/文本节点的大小为正
来自WebDriver specifications Element displayedness
元素显示算法为布尔状态,其中true 表示该元素已显示,而false表示该元素 元素不显示。要计算元素上的状态,请调用 致电(
bot.dom.isShown, null, element
。
来自github中的bot.dom.isShown_(第437行)
function positiveSize(e) {
var rect = bot.dom.getClientRect(e);
if (rect.height > 0 && rect.width > 0) {
return true;
}
// A vertical or horizontal SVG Path element will report zero width or
// height but is "shown" if it has a positive stroke-width.
if (bot.dom.isElement(e, 'PATH') && (rect.height > 0 || rect.width > 0)) {
var strokeWidth = bot.dom.getEffectiveStyle(e, 'stroke-width');
return !!strokeWidth && (parseInt(strokeWidth, 10) > 0);
}
// Zero-sized elements should still be considered to have positive size
// if they have a child element or text node with positive size, unless
// the element has an 'overflow' style of 'hidden'.
return bot.dom.getEffectiveStyle(e, 'overflow') != 'hidden' &&
goog.array.some(e.childNodes, function(n) {
return n.nodeType == goog.dom.NodeType.TEXT ||
(bot.dom.isElement(n) && positiveSize(n));
});
}