Как проверить, действительно ли щелчок что-то сделал, или альтернативное решение

Я создаю несколько тестов в Selenium с помощью NUnit. У меня проблема с тем, что некоторые из моих кликов не выполняются из-за того, что кнопки не загружаются должным образом. У меня есть ожидание, которое должно подождать, пока кнопки станут активными, но они кажутся кликабельными раньше, чем они есть на самом деле, и щелчок не выполняется. Я вижу, что элемент имеет правильную ссылку href до того, как я нажму, но ничего не происходит.

Статическая задержка перед щелчком действительно «исправляет» это, но это плохое решение, которое замедляет весь процесс тестирования и часто ломается во время стрессовых тестов.

Я почти уверен, что javascript на странице работает медленно и не инициализировался должным образом до щелчка.

Я думал о том, чтобы вместо того, чтобы проверять, доступен ли он для щелчка, вместо этого проверьте, сделал ли щелчок что-нибудь. Я подумал о сопоставлении источника страницы до и после щелчка, но не все щелчки обязательно изменяют html, так что вместо этого просто нарушаются другие тесты.

Вот мой текущий метод щелчка. Хотя ждать, похоже, бесполезно.

    public void click(IWebElement element)
    {
        IsDisplayed(element);

        Console.Write("Clicking " + element.GetAttribute("href"));

        WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
        wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(element));

        element.Click();

        Console.WriteLine(" ✓");
    }

Тест, который регулярно терпит неудачу, - это тот, где я просто открываю страницу и нажимаю кнопку после проверки отображения некоторых элементов.


person Jaco9307    schedule 25.10.2019    source источник
comment
Добавьте фрагмент кода в свой вопрос, чтобы получить четкое представление о вашей проблеме.   -  person Ashish Rathi    schedule 25.10.2019


Ответы (1)


Кажется, вы были близки. Поскольку вы вызвали WebDriverWait для ElementToBeClickable(), после того, как элемент будет возвращен, вам нужно вызвать click() для него. Фактически ваш блок кода будет:

WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(element)).Click();

Обновлять

В качестве альтернативы вы можете использовать ExecuteScript() из IJavaScriptExecutor следующим образом:

WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(element)));
person DebanjanB    schedule 25.10.2019
comment
Ваш пример кажется более эффективным, но чем он по функциям отличается от ожидания и последующего щелчка по элементу, как это сделал я? - person Jaco9307; 25.10.2019
comment
Я думаю, что в вашем блоке кода, когда вы использовали element.Click();, был рассмотрен элемент element, который был возвращен из IsDisplayed(), но не элемент element, который был возвращен после WebDriverWait(). Следовательно, я хочу, чтобы вы вызывали click() сразу после того, как element возвращается после WebDriverWait() - person DebanjanB; 25.10.2019
comment
@ Jaco9307 Обновите вопрос, указав полную трассировку стека ошибок, которую вы видите - person DebanjanB; 25.10.2019
comment
Проблема в том, что я не получаю сообщение об ошибке. Он просто нажимает кнопку, которая еще не работает. Тест просто продолжается, как если бы он работал, а затем терпит неудачу, когда не может найти ожидаемый элемент, потому что не открывал меню. - person Jaco9307; 25.10.2019
comment
@ Jaco9307 Получите обновленный ответ и сообщите мне статус. - person DebanjanB; 25.10.2019
comment
Я просто получаю JavaScriptError: документ был выгружен почти во всех моих тестах - person Jaco9307; 25.10.2019