Доброго времени!
Подскажите плиз как достучаться в WebDriver до свойств элемента. У меня задача такая - нужно дождаться, что свойство элемента пропало. При загрузке страницы кнопка на тулбаре выглядит так:
Проблема в том, что это хитроумный Angular. На данный момент я вставил костыль в виде паузы, но хочется более красивого решения Если что, пишу на C#, но думаю это не принципиально
Вот что такое пятница не смог вспомнить про 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);
}
}
}
// 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);
}
Ну я потом в коде имею возможность просто вставить такую понятную конструкцию: _signBtnElement.WaitUntilEnable().Click();
А сама конструкция ожидания - ну да, не две строчки