Selenium - как проверить форму, не представленную по клику?(проверка клиента работает) - PullRequest
1 голос
/ 07 апреля 2019

Можно ли проверить, что страница не перезагружается при нажатии «Отправить» с помощью Selenium?

В настоящее время тест указывает браузеру открыть форму отправки и сразу же нажимает «Отправить», не заполняя поля.

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

Кстати, я использую C # - если это имеет значение.

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Если требуется только проверка перезагрузки, вы можете проверить устаревание элемента, который присутствовал на странице ранее. Небольшой пример кода:

    public bool IsNewPageLoaded(IWebElement elementToGoStale)
    {
        try
        {
            var enabled = elementToGoStale.Enabled;
            return false;
        }
        catch(Exception ex)
        {
            if (ex is StaleElementReferenceException || ex is NoSuchElementException)
            {
                return true; // Expected exception on accessing stale element: page has been renewed
            }

            throw ex;
        }
    }

Приятно то, что вам не нужна дополнительная информация о том, что происходит после загрузки страницы: все, что вам нужно, это сохранить IWebElement, который вы можете проверить позже.

Я использую подобные проверки в своих тестах. Несмотря на то, что я по-прежнему считаю, что попытка-уловка выглядит некрасиво, пока она доказала свою исключительную надежность.

1 голос
/ 07 апреля 2019

Я думаю, что в этом случае вам нужно будет проверить страницу после отправки, либо успешную страницу, либо оригинал, чтобы определить, была ли успешной ввод формы:)

Обычно вы проверяете сообщение об ошибке, возвращаемое призаданная всплывающая или входная форма, которая приведет вас к выводу, что ввод был неудачным, но в этом случае это кажется невозможным.

Утверждение заданного URI страницы и /или элементы страницы, помогут вам определить результат.

0 голосов
/ 10 апреля 2019

основываясь на ответе @Tybs, я управлял вспомогательным классом.

public class NoReloadVerificationContext : IDisposable
{
    private readonly IWebElement bodyElement;
    public NoReloadVerificationContext(IWebDriver webDriver)
    {
        this.bodyElement = webDriver.FindElement(By.TagName("body"));
    }

    public void Dispose() => Assert.True(this.bodyElement.Enabled);
}

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

Пример использования:

// This block asserts that no reload occurred after executing operation inside
// Else it throws an exception - which is OK for me. 
using (new NoReloadVerificationContext(driver))
{
    // this will submit the form and cause page reload because of missing client vlidations
    driver.FindElementByCssSelector("form input[type=submit]").Click();
} // The exception will occur here.

Я не знаю, является ли это лучшим решением, но оно будет работать в большинстве случаев (не только в формах)

Другой подход состоял в том, чтобы получить значение __RequestVerificationToken внутри моей формы (MVC генерирует его в конце каждой формы), затем выполнить некоторые действия, после этого получить значение снова и сравнить со старым. Но это будет работать только для представления формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...