.invisibilityOfElementLocated не уместен для ангуляра?

angularjs
webdriver
protractor
Теги: #<Tag:0x00007fedc7aa79d8> #<Tag:0x00007fedc7aa7870> #<Tag:0x00007fedc7aa7708>

(Nikitoz777) #1

есть такое подозрение что данный метод работает некорректно при автоматизации морды на ангуляре, а именно:
если элемент скрыт, то в аттрибут class приписывается значение "ng-hide" и более никаких изменений в этом элементе. соотвественно, вебдрайвер такое не распознает.

прав ли я?


(Рома Маринский) #2

Используй ожидание атрибута со значением, как раз таки ng-hide


(Nikitoz777) #3

да, так и делаю...


(Сергей Кузьмин) #4

если можно - покажите код
попробуйте вычислить этот атрибут средствами Angular а не WebDriver

angular.element(element).scope().$eval(expression);


(Nikitoz777) #5

location=".spinner:not(.ng-hide)"

  def static wait(String location, long timeout = 20) {
        new WebDriverWait(DriverManager.getWebDriver(), timeout).pollingEvery(2, TimeUnit.SECONDS).until(new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver d) {
                return (d.findElements(By.cssSelector(location)).size() == 0);
            }
        })
    }

(Сергей Кузьмин) #6

я недавно занимался
.net и java портами Protracror (я недостаночно пока себя комфортно чувствую с node и поэтому ...)
* jProtractor
* protractor-net

  • в частности практиковался на примерах
    в проекте найдете детали как это реализовано. вот ссылка на PDF презентации

специально ng-hide по-моему примера до сих п нет
но есть другие (их достаточно много) выглядит это так:

    public void testButtonNgIf() throws Exception {
        //if (isCIBuild) { // Alert not handled by PhantomJS
        //    return;
        //}
        getPageContent("ng_watch_ng_if.htm");        

        WebElement button = seleniumDriver.findElement(By.cssSelector("button.btn"));
        ngDriver.waitForAngular();
        highlight(button);
        NgWebElement ng_button = new NgWebElement(ngDriver, button);
        assertThat(ng_button, notNullValue());
        assertThat(ng_button.getAttribute("ng-click"), equalTo("house.frontDoor.open()"));
        assertThat(ng_button.getText(), equalTo("Open Door"));         
        ngDriver.waitForAngular();
        try {            
            state = ((Boolean) ng_button.evaluate("!house.frontDoor.isOpen")).booleanValue(); 
        } catch(Exception ex) { 
            System.err.println("evaluate was not handled : " + ex.getStackTrace().toString());
        }
        assertTrue(state);
        button.click();
        try{
            // confirm alert
            seleniumDriver.switchTo().alert().accept();
        } catch (NoAlertPresentException ex){
            // Alert not present - ignore            
        } catch(WebDriverException ex){            
            System.err.println("Alert was not handled : " + ex.getStackTrace().toString());
            return;
        }
        button = seleniumDriver.findElement(By.cssSelector("button.btn"));
        highlight(button);
        ng_button = new NgWebElement(ngDriver, button);
        assertThat(ng_button, notNullValue());
        assertThat(ng_button.getAttribute("ng-click"), equalTo("house.frontDoor.close()"));
        assertThat(ng_button.getText(), equalTo("Close Door"));        
        try {            
            state = ((Boolean) ng_button.evaluate("house.frontDoor.isOpen")).booleanValue(); 
        } catch(Exception ex) { 
            // [JavaScript Error: "e is null"] ?
            System.err.println("evaluate was not handled : " + ex.getStackTrace().toString());
        }
        assertTrue(state);
    }

во всем этом интересно

ng_button.evaluate("!house.frontDoor.isOpen")).booleanValue();

если можете дать url или fiddle вашей страницы создать test ничего не стоит (для проверки ng-hide наверное несложно выделить работающую страницу как standalone) .

то есть надо найти что Angular присваивает

ng-show="???"
и попросить это вычислить и ждать пока изменится..