是否可以有没有高度和宽度的可见元素?

时间:2020-01-09 10:07:47

标签: html css selenium selenium-webdriver dom

我一直在研究现有的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;
}

据我了解,每个可见/可交互的元素的高度和宽度都是正的。我很困惑为什么要编写此代码。

请您确认我的理解是否正确?如果没有,请帮助我了解可能的情况。

1 个答案:

答案 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));
        });
    }