Как проверить что элемента пропало\изменилось свойство

angularjs
webdriver
selenium
Теги: #<Tag:0x00007fedc03a6550> #<Tag:0x00007fedc03a6258> #<Tag:0x00007fedc03a5f10>

(Alexander Maximov) #1

Доброго времени!
Подскажите плиз как достучаться в WebDriver до свойств элемента. У меня задача такая - нужно дождаться, что свойство элемента пропало. При загрузке страницы кнопка на тулбаре выглядит так:

<button title="Подписать" ng-class="{ 'active': action.active($ctrl.context) }" class="grid-button action-sign" type="button" ng-disabled="action.disabled($ctrl.context)" ng-click="action.invoke($ctrl.context)" ng-repeat="action in $ctrl.toolbarActions" disabled="disabled">
<div class="icon sign" title="Подписать"></div>
</button>

После выделения строки в гриде у неё пропадает свойство disabled:

<button title="Подписать" ng-class="{ 'active': action.active($ctrl.context) }" class="grid-button action-sign" type="button" ng-disabled="action.disabled($ctrl.context)" ng-click="action.invoke($ctrl.context)" ng-repeat="action in $ctrl.toolbarActions">
<div class="icon sign" title="Подписать"></div>
</button>

Проблема в том, что это хитроумный Angular. На данный момент я вставил костыль в виде паузы, но хочется более красивого решения :slight_smile: Если что, пишу на C#, но думаю это не принципиально


#2

wait.until(new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver driver) {
        WebElement button = driver.findElement(By.xpath("xpath"));
        String disabled = button.getAttribute("disabled");
        return disabled == null;
    }
});```

(Taras) #3

то лучше и красивее 8-ой Java написать через ->


(Alexander Maximov) #4

Вот что такое пятница :frowning: не смог вспомнить про getAttribute.
У меня во фрейме, который я заюзал есть уже extention для ожидания появления, я рядом по образу и подобию наваял ожидание доступности. если что для код для страждущих:

        public static IWebElement UntilEnable(IWebElement element, TimeSpan timeOut)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            while (true)
            {
                Exception lastException = null;
                try
                {
                    if (element.GetAttribute("disabled") == null)
                    {
                        return element;
                    }
                    System.Threading.Thread.Sleep(100);
                }
                catch (Exception e)     { lastException = e; }

                if (sw.Elapsed > timeOut)
                {
                    string exceptionMessage = lastException == null ? "" : lastException.Message;
                    string errorMessage = string.Format("Wait.UntilEnable: Element was not enabled after {0} Milliseconds" +
                                                        "\r\n Error Message:\r\n{1}", timeOut.TotalMilliseconds, exceptionMessage);
                    throw new TimeoutException(errorMessage);
                }
            }
        }

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

попробуйте protractor - он умеет eval (имею в виде https://github.com/bbaia/protractor-net a не обязательно.
https://github.com/angular/protractor

// javascript in the  browser 
/**
         * Evaluate an Angular expression in the context of a given element.
         *
         * arguments[0] {Element} The element in whose scope to evaluate.
         * arguments[1] {string} The expression to evaluate.
         *
         * @return {?Object} The result of the evaluation.
         */
        public const string Evaluate = "return angular.element(arguments[0]).scope().$eval(arguments[1]);";
// c#  call of the 
public object Evaluate(string expression)
        {
            this.ngDriver.WaitForAngular();
            return ((IJavaScriptExecutor)this.ngDriver.WrappedDriver).ExecuteScript(ClientSideScripts.Evaluate, this.element, expression);
        }


(Taras) #6

omg, зачем так все услажнять?)


(Alexander Maximov) #7

Ну я потом в коде имею возможность просто вставить такую понятную конструкцию:
_signBtnElement.WaitUntilEnable().Click();
А сама конструкция ожидания - ну да, не две строчки :slight_smile: