Javascript 等待selenium webdriver中的角度响应

Javascript 等待selenium webdriver中的角度响应,javascript,java,jquery,angular,selenium-webdriver,Javascript,Java,Jquery,Angular,Selenium Webdriver,我正在使用SeleniumWebDriver(Java)自动化一个基于angular的应用程序 在my AUT(正在测试的应用程序)中,从下拉列表中选择任何选项后,它会将数据加载到页面中。现在这种加载是基于ajax的,基本上它调用一个Web服务并返回数据,但是页面加载微调器或消息并没有在这个时间间隔内显示。之前,我在显式等待中使用以下javascript notDisplay = Boolean.valueOf(((JavascriptExecutor) input) .executeScr

我正在使用SeleniumWebDriver(Java)自动化一个基于angular的应用程序

在my AUT(正在测试的应用程序)中,从下拉列表中选择任何选项后,它会将数据加载到页面中。现在这种加载是基于ajax的,基本上它调用一个Web服务并返回数据,但是页面加载微调器或消息并没有在这个时间间隔内显示。之前,我在显式等待中使用以下javascript

notDisplay = Boolean.valueOf(((JavascriptExecutor) input)
  .executeScript("return angular.element(document).injector()
  .get('$http').pendingRequests.length === 0")
  .toString());
但现在它不起作用了。不工作意味着它总是返回true,因此它不会等待加载

这个应用程序使用angular,所以我尝试实现基于angular的等待策略,但我以前也尝试使用jQuery或JS等待策略,但它也不起作用。对于jQuery,我使用以下JavaScriptExecutor

boolean jqueryReady = (Boolean) ((JavascriptExecutor)driver)
  .executeScript("return jQuery.active==0")
谁能帮我一下吗。为了更好地理解应用程序,我还附加了DOM结构

<head>
<meta charset="utf-8">
<title>XISOT | Energy Software</title>
<base href="/">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="assets/css/font-include.css" rel="stylesheet">
<link href="assets/css/datepicker-theme.css" rel="stylesheet">
<link href="assets/css/component.css" rel="stylesheet">
<link href="assets/css/custom.css" rel="stylesheet">
<script async="" src="https://www.google-analytics.com/analytics.js">
<script async="" src="https://www.google-analytics.com/analytics.js">
<script async="" src="https://www.google-analytics.com/analytics.js">
<script async="" src="https://www.google-analytics.com/analytics.js">
<script async="" src="https://www.google-analytics.com/analytics.js">
<script async="" src="https://www.google-analytics.com/analytics.js">
<script src="https://use.fontawesome.com/webfontloader/1.6.24/webfontloader.js">
<script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-MH7JJN7">
<script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.js">
<script src="https://use.fontawesome.com/7fbaaf4e79.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/accounting.js/0.4.1/accounting.min.js">
<link rel="stylesheet" media="screen" href="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.30.0/handsontable.full.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.30.0/handsontable.full.js">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.3/Chart.bundle.min.js">
<script src="https://www.google.com/jsapi">
<script>
<link rel="stylesheet" href="https://use.fontawesome.com/7fbaaf4e79.css" media="all">
<script src="https://www.google.com/uds/?file=visualization&v=1.0&packages=corechart" type="text/javascript">
<link href="https://www.google.com/uds/api/visualization/1.0/40ff64b1d9d6b3213524485974f36cc0/ui+en.css" type="text/css" rel="stylesheet">
<script src="https://www.google.com/uds/api/visualization/1.0/40ff64b1d9d6b3213524485974f36cc0/format+en,default+en,ui+en,corechart+en.I.js" type="text/javascript">
<script src="https://www.gstatic.com/charts/loader.js">
<link href="styles.77279c25a29673778a1c.bundle.css" rel="stylesheet">
<style>
<script type="text/javascript" charset="utf-8" async="" src="0.9bd994105eb2d54dba78.chunk.js">
<script type="text/javascript" charset="utf-8" async="" src="10.328d3d60aa813c93c06a.chunk.js">
<script type="text/javascript" charset="utf-8" async="" src="1.af512bfedea06d5a0cbc.chunk.js">
<style>
<style>
<style>
<style>
</head>
<body class="" style="padding-right: 0px;">
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MH7JJN7" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<******-cli-app ng-version="4.0.1">
<script type="text/javascript" src="inline.a72ddd58b7d594fb4f3e.bundle.js">
<script type="text/javascript" src="polyfills.c88a23e25eb2f45b7bb7.bundle.js">
<script type="text/javascript" src="scripts.fd3b917905e45b8ba8f8.bundle.js">
<script type="text/javascript" src="vendor.ebddd23038be460d8b8d.bundle.js">
<script type="text/javascript" src="main.f9ced3beb42f51486f9b.bundle.js">
<script id="" type="text/javascript">
<script id="" type="text/javascript">
<script id="" type="text/javascript">
<script id="" type="text/javascript">
<script id="" type="text/javascript">
<script id="" type="text/javascript">
</body>

XISOT |能源软件

如果应用程序使用的是angular 5或更高版本,请使用下面的java脚本

String angularwait = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1"

notDisplay = Boolean.valueOf(((JavascriptExecutor) input).executeScript(angularwait).toString());

如果您的应用程序使用angular 5或更高版本,请使用下面的java脚本

String angularwait = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1"

notDisplay = Boolean.valueOf(((JavascriptExecutor) input).executeScript(angularwait).toString());

除了你的支票,Angular在背景中做了很多事情。您可以将下面的代码片段放在一个单独的类中,并在所需的类中调用该方法(WaitUntiLanguarReady)。此外,必须将WebDriver对象发送到此类(setDriver方法),并放在项目中合适的位置。对于Angular 7.2.0版,这对我来说很好

public class WaiterForAngular{
 private WebDriver driver;
    private WebDriverWait jsWait;
    private JavascriptExecutor jsExec;
 
    //Get the driver 
    public void setDriver (WebDriver driver) {
        jsWait = new WebDriverWait(driver, 10);
        jsExec = (JavascriptExecutor) driver;
}

        public void waitUntilAngularReady() {
        try {
        Object angular5Check = jsExec.executeScript(
        "return getAllAngularRootElements()[0].attributes['ng-version']");
        if (angular5Check != null) {
        Boolean angularPageLoaded = (Boolean) jsExec.executeScript(
        "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1");
        if (!angularPageLoaded) {
        sleep(10);
        waitForAngular5Load();
        sleep(10);
        }
        }
        } catch (Exception e) {
        }
        }
    
        private void waitForAngular5Load() {
                String angularReadynessScript = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1";
                angularLoads(angularReadynessScript );
            }
    
private void angularLoads(String angularReadynessScript ) {
        try {
            ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver)
                .executeScript(angularReadynessScript ).toString());
 
            boolean angularReady = Boolean.valueOf(jsExec.executeScript(angularReadynessScript ).toString());
 
            if (!angularReady) {
                jsWait.until(angularLoad);
            }
        } catch (Exception e) {
        }
    }


        private void sleep(long milliseconds){
        try{
        Thread.sleep(milliseconds);
        }
        catch(Exception e){
        }
}
公共类WaiterOrangular{
私有网络驱动程序;
私有WebDriverWait-jsWait;
私有JavascriptExecutor jsExec;
//抓住司机
公共无效设置驱动程序(WebDriver驱动程序){
jsWait=newwebdriverwait(驱动程序,10);
jsExec=(JavascriptExecutor)驱动程序;
}
public void waitUntiLanglarReady(){
试一试{
对象angular5Check=jsExec.executeScript(
“返回getAllAngularRootElements()[0]。属性['ng-version']”;
如果(angular5Check!=null){
布尔angularPageLoaded=(布尔)jsExec.executeScript(
“返回窗口.getAllAngularTestabilities().findIndex(x=>!x.isStable())===-1”);
如果(!angularPageLoaded){
睡眠(10);
waitForAngular5Load();
睡眠(10);
}
}
}捕获(例外e){
}
}
私有void waitForAngular5Load(){
String angularReadynessScript=“返回窗口.getAllAngularTestabilities().findIndex(x=>!x.isStable())===-1”;
角度载荷(AngularReadynesScript);
}
专用void angularLoads(字符串angularreadinessscript){
试一试{
ExpectedCondition angularLoad=driver->Boolean.valueOf(((JavascriptExecutor)驱动程序)
.executeScript(angularReadynesScript).toString());
boolean angularReady=boolean.valueOf(jsExec.executeScript(angularreadinessscript.toString());
如果(!angularReady){
jsWait.until(角度负载);
}
}捕获(例外e){
}
}
私有无效睡眠(长毫秒){
试一试{
睡眠(毫秒);
}
捕获(例外e){
}
}

Angular在后台除了检查之外做了很多工作。您可以将下面的代码片段放在单独的类中,并在所需的类中调用该方法(WaitUntiLanguarReady)。此外,您还必须向该类发送WebDriver对象(setDriver方法)在项目中的一个舒适的地方。对于Angular版本7.2.0,这对我来说很好

public class WaiterForAngular{
 private WebDriver driver;
    private WebDriverWait jsWait;
    private JavascriptExecutor jsExec;
 
    //Get the driver 
    public void setDriver (WebDriver driver) {
        jsWait = new WebDriverWait(driver, 10);
        jsExec = (JavascriptExecutor) driver;
}

        public void waitUntilAngularReady() {
        try {
        Object angular5Check = jsExec.executeScript(
        "return getAllAngularRootElements()[0].attributes['ng-version']");
        if (angular5Check != null) {
        Boolean angularPageLoaded = (Boolean) jsExec.executeScript(
        "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1");
        if (!angularPageLoaded) {
        sleep(10);
        waitForAngular5Load();
        sleep(10);
        }
        }
        } catch (Exception e) {
        }
        }
    
        private void waitForAngular5Load() {
                String angularReadynessScript = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1";
                angularLoads(angularReadynessScript );
            }
    
private void angularLoads(String angularReadynessScript ) {
        try {
            ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver)
                .executeScript(angularReadynessScript ).toString());
 
            boolean angularReady = Boolean.valueOf(jsExec.executeScript(angularReadynessScript ).toString());
 
            if (!angularReady) {
                jsWait.until(angularLoad);
            }
        } catch (Exception e) {
        }
    }


        private void sleep(long milliseconds){
        try{
        Thread.sleep(milliseconds);
        }
        catch(Exception e){
        }
}
公共类WaiterOrangular{
私有网络驱动程序;
私有WebDriverWait-jsWait;
私有JavascriptExecutor jsExec;
//抓住司机
公共无效设置驱动程序(WebDriver驱动程序){
jsWait=newwebdriverwait(驱动程序,10);
jsExec=(JavascriptExecutor)驱动程序;
}
public void waitUntiLanglarReady(){
试一试{
对象angular5Check=jsExec.executeScript(
“返回getAllAngularRootElements()[0]。属性['ng-version']”;
如果(angular5Check!=null){
布尔angularPageLoaded=(布尔)jsExec.executeScript(
“返回窗口.getAllAngularTestabilities().findIndex(x=>!x.isStable())===-1”);
如果(!angularPageLoaded){
睡眠(10);
waitForAngular5Load();
睡眠(10);
}
}
}捕获(例外e){
}
}
私有void waitForAngular5Load(){
String angularReadynessScript=“返回窗口.getAllAngularTestabilities().findIndex(x=>!x.isStable())===-1”;
角度载荷(AngularReadynesScript);
}
专用void angularLoads(字符串angularreadinessscript){
试一试{
ExpectedCondition angularLoad=driver->Boolean.valueOf(((JavascriptExecutor)驱动程序)
.executeScript(angularReadynesScript).toString());
boolean angularReady=boolean.valueOf(jsExec.executeScript(angularreadinessscript.toString());
如果(!angularReady){
jsWait.until(角度负载);
}
}捕获(例外e){
}
}
私有无效睡眠(长毫秒){
试一试{
睡眠(毫秒);
}
捕获(例外e){
}
}

请阅读原因。粘贴代码并正确设置格式。此外,“不工作”是模糊的。请说明它是如何工作的,并粘贴任何相关的错误消息等。您可能希望将和结合起来。或者您可以使用@Jeffs谢谢您的建议,我根据您的建议修改我的问题。@Tuyen Nguyen我已经提到我尝试使用wait for jQuery和js wait,但它总是返回true,因此意味着它显示页面已加载,对于微调器和加载器部分,我已经提到,它没有按照设计显示在我的页面中。请阅读原因。粘贴代码并正确格式化。此外,“不是工作”