Selenium 将 Web 元素隐藏在导航栏后面

Selenium 将 Web 元素隐藏在导航栏后面

我在将值写入输入元素时遇到问题。

截屏

当 Selenium 调用该输入字段时,页面会滚动到顶部,并且输入会隐藏在导航栏后面。

在上诉之前,我执行了以下代码:

int elementPosition = element.getLocation().getY();
String js = String.format("window.scroll(0, %s)", elementPosition-90);
((JavascriptExecutor)driver).executeScript(js);

但即使在我滚动之后,输入仍然被隐藏。

另外,我尝试通过 JavaScript 为该字段设置一个值:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].setAttribute('value', '"+date+"')",element);

不幸的是,这也无济于事。

环境:Selenium 3.6.0 ver,FireFox 66 ver。

答案1

我使用下面一对方法来滚动到视图中:

/**
 * Wait until JQuery is inactive
 * @author Bill Hileman
 */
public void waitForJQueryToBeInactive() {

    Boolean isJqueryUsed = (Boolean) ((JavascriptExecutor) driver)
            .executeScript("return (typeof(jQuery) != 'undefined')");

    if (isJqueryUsed) {
        while (true) {
            // JavaScript test to verify jQuery is active or not
            Boolean ajaxIsComplete = (Boolean) (((JavascriptExecutor) driver)
                    .executeScript("return jQuery.active == 0"));
            if (ajaxIsComplete)
                break;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
    }

}

/** 
 * Scroll a web element into view
 * @author Bill Hileman
 * @param ele - WebElement
 */
public void scrollIntoView(WebElement ele) {

    ((JavascriptExecutor)driver).executeScript("window.scrollTo(" + ele.getLocation().x + 
                                                                "," + ele.getLocation().y + ")");
    waitForJQueryToBeInactive();

}

答案2

我测试的网站是用 ExtJS 单页类型的网页编写的。当元素不在视图中时,我仍然能够使用该.SendKeys()方法在框中输入内容。这种情况发生得非常快,但我正在使用的框在屏幕上聚焦,没有任何问题。

如果您在语句thread.sleep();后面放置一个.SendKeys(),您应该会在页面的可见位置看到您正在交互的框。

相关内容