javascript - Selenium 和 Angularjs 等待执行一些操作

标签 javascript java angularjs selenium selenium-webdriver

我正在使用 selenium 来测试 AngularJS 应用程序。我面临的问题是,在页面完全加载之前,我无法在页面上执行任何操作。我可以放置 Thread.sleep(),但据我所知,这不是一个好的解决方案。有很多方法可以等待页面加载(我用谷歌搜索),但我想我已经尝试了所有方法,但仍然没有运气。在我的应用程序中,当转到网页时,所有内容看起来都已加载(从视觉 Angular 来看),但在整个页面加载(大约 1 秒)之前我无法执行任何 Activity 。 你们能分享一下你们的实现方式吗?它实际上是有效的

谢谢

我的代码:

public By ngWait(final By by) {
    return new FluentBy() {
        @Override
        public void beforeFindElement(WebDriver driver) {
            driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
            ((JavascriptExecutor) driver).executeAsyncScript("var callback = arguments[arguments.length - 1];" +
                    "angular.element(document.body).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);");
            super.beforeFindElement(driver);
        }

        @Override
        public List<WebElement> findElements(SearchContext context) {
            return by.findElements(context);
        }

        @Override
        public WebElement findElement(SearchContext context) {
            return by.findElement(context);
        }

        @Override
        public String toString() {
            return "ngWait(" + by.toString() + ")";
        }
    };
}

enter image description here

enter image description here

最佳答案

我在使用 Selenium 针对 Angular 应用程序编写测试时遇到了类似的情况。实际上,在 Angular 应用程序中,页面的骨架或 View 会立即加载,但它会在后台不断调用 $http 请求来获取数据。一旦 Angular 应用程序完成 $http 调用,它就会使用 $http 调用的响应来渲染 View 。因此,有一个经典的 selenium 等待,如 waitUntilPageToBeLoadwaitUntilElementToBeClickable 在这里根本不起作用。另一个解决方案是使用 Thread.Sleep() ,但正如您所提到的,这不是智能等待。

那么为什么不使用 wait 方法来确保 $http 调用在后台完成。您可以尝试下面的等待方法,它对我有用。我希望它也对您有用!

    public void untilAngularFinishHttpCalls() {
        final String javaScriptToLoadAngular =
                "var injector = window.angular.element('body').injector();" + 
                "var $http = injector.get('$http');" + 
                "return ($http.pendingRequests.length === 0)";

        ExpectedCondition<Boolean> pendingHttpCallsCondition = new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
                return ((JavascriptExecutor) driver).executeScript(javaScriptToLoadAngular).equals(true);
            }
        };
        WebDriverWait wait = new WebDriverWait(driver, 20); // timeout = 20 secs
        wait.until(pendingHttpCallsCondition);
    }

关于javascript - Selenium 和 Angularjs 等待执行一些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621451/

相关文章:

java - 如何在Java中设置Email客户端?

javascript - 将原生 JS 转换为 Angularjs 以计算两个日期之间的天数?

javascript - ng-map 未定义形状对象

javascript - Discord.js。无法为斜杠命令添加权限

javascript - 尝试使用 ECMAScript 正则表达式获取不存在字符串的数据子集

java - Tomcat : Required request part 'file' is not present

php - AngularJS 使用 FormData API 上传多个文件

javascript - 获取javascript中的点击来源?

javascript - 在 Node.js 中监视 require

java - 如何在不使用 web.xml 的情况下将 JavaEE 7/JPA 2.1 动态 Web 应用程序部署到 IBM Liberty Profile