Не удается поймать WebDriverException для определенных элементов - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующие элементы, идентифицированные в объекте страницы ..

public WindowsElement usernameField => _session.FindElementByAccessibilityId("UserName");
public WindowsElement passwordField => _session.FindElementByAccessibilityId("Password");
public WindowsElement menuButton => _session.FindElementByXPath("//Button[contains(@Name, 'Menu')]");

У меня есть тест со следующими шагами ..

WaitForObject(usernameField)
usernameField.SendKeys("...")

WaitForObject(passwordField)
passwordField.SendKeys("...")

ClickButton("Sign In");

WaitForObject(menuButton);
menuButton.Click();

И ниже, вот мой WaitForObject method ..

// Wait for an Object to be accessible
public void WaitForObject(WindowsElement element)
{
       var wait = new DefaultWait<WindowsDriver<WindowsElement>>(_session)
       {
           Timeout = TimeSpan.FromSeconds(10),
           PollingInterval = TimeSpan.FromSeconds(1)
       };

       wait.IgnoreExceptionTypes(typeof(WebDriverException));
       wait.IgnoreExceptionTypes(typeof(InvalidOperationException));
       wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException));
       wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
       wait.IgnoreExceptionTypes(typeof(NotFoundException));

       WindowsElement waitElement = null;

       wait.Until(driver =>
       {
           waitElement = element;

           return waitElement != null && waitElement.Enabled && waitElement.Displayed;
       });
}

Метод WaitForObject отлично работает для проверок usernameField & passwordField, но по какой-то причине он сразу завершается ошибкой при передаче в menuButton. Я знаю, что он правильно проверял usernameField & passwordField, потому что я включил несколько Console.WriteLines () для распечатки всякий раз, когда он обнаружит одно из этих исключений. Как только он попадает в menuButton, ничего не регистрируется, он сразу же завершается с ошибкой WebDriverException

OpenQA.Selenium.WebDriverException: элемент не может быть расположен на странице с использованием заданных параметров поиска.

Почему бы не действовать так же для кнопки меню? Я пробовал другие подходы, используя циклы while, перехватывающие общие исключения, но тем не менее он сразу завершается сбоем, когда попадает в этот элемент с WebDriverException.

Если я использую Thread.Sleep (10000) перед попыткой проверить элемент , он работает нормально и выполняет щелчок ..

Я использую библиотеки WinAppDriver / Appium.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Ой, подождите, извините, я посмотрел ваш код более внимательно. По сути, это происходит потому, что параметр метода запрашивает сам тип, когда C# передает элемент в WaitForObject, он пытается вычислить выражение «WindowsElement menuButton», когда оно передается в WaitForObject. Изменяя метод WaitForObject для приема делегата, вы будете откладывать эту оценку до момента ожидания.

Вам нужно будет изменить свой WaitForObject на что-то вроде:

public void WaitForObject(Func<WindowsElement> element)

// Unchanged code here

wait.Until(driver =>
       {
           waitElement = element();

           return waitElement != null && waitElement.Enabled && waitElement.Displayed;
       });

ТОГДА вызовите это как: WaitForObject (() => menuButton); menuButton.Click ();

2 голосов
/ 06 февраля 2020

вы можете попробовать использовать регулярное выражение вместо кнопки, используйте '*', поскольку inspect.exe не определяет тег, т.е. кнопку.

else go С поиском элемента с локатором имени.

...