Использование webdriver PageFactory для выбора определенной страницы

У меня есть веб-проект, в котором нажатие кнопки переходит на другую страницу. Новая страница может быть одной из трех возможных страниц в зависимости от данных на сервере. (URL-адрес может быть одинаковым для 2 из этих страниц)

У меня есть три класса, представляющие ожидаемые элементы на каждой странице с использованием модели PageObject.

Каков наилучший способ узнать, какая страница действительно была загружена? Есть ли тип ожидания ИЛИ, когда я могу подождать с тремя уникальными элементами и получить тот, который действительно был загружен?


person randomThought    schedule 21.11.2012    source источник


Ответы (2)


Да, можно проверить наличие уникального элемента (идентифицирующего страницу), а затем вернуть соответствующую страницу в фреймворк.

Тем не менее, тест должен знать страницу, которую он ожидает следующей, и должен предполагать, что правильная страница загружена, и выполнять дальнейшие действия/утверждения. Вы даже можете разместить здесь утверждение, чтобы убедиться, что загрузилась правильная страница. Если загружена другая страница, то тест в конечном итоге завершится неудачно, так как утверждения не пройдут. Таким образом, тест становится более читаемым и описывает поток приложения.

Кроме того, всегда рекомендуется заранее настраивать тестовые данные для тестов. Таким образом, вы будете знать, какие данные доступны на сервере, а тест будет знать, какая страница будет отображаться.

person Pani Kumar    schedule 21.11.2012
comment
В этом случае было бы немного сложно понять, какую страницу ожидать следующей, поскольку приложение использует OAuth и перенаправляется к провайдеру OAuth, а учетные записи пользователей, которые используются в тестах, могут уже давать или не давать разрешение для этого приложения, поскольку пул пользователей распределяется между разными тестами - person randomThought; 22.11.2012
comment
Ok. Если это так, мы должны написать код C#, который проверяет наличие этих уникальных элементов (сообщает об отображении страницы) и возвращает соответствующий объект страницы. - person Pani Kumar; 22.11.2012

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

Сначала я просто ждал, а затем протестировал вторую страницу, но это было просто болью, поэтому я придумал это.

Чтобы проверить результат с помощью этого:

var whichScreen = waitForEitherElementText(By.CssSelector(HeaderCssUsing), "HOME SCREEN", "home", terms.getHeaderLocator(), terms.headerText, "terms", driver, MAX_STALE_RETRIES);

        if(whichScreen.Item1 && whichScreen.Item2 == "terms")
        {
            terms.aggreeToTerms();
        }

Метод, который вызывает это:

    protected Tuple<bool, string> waitForEitherElementText(By locator1, string expectedText1, string return1Ident,
        By locator2, string expectedText2, string return2Ident, IWebDriver driver, int retries)
    {
        var retryCount = 0;
        string returnText = "";
        WebDriverWait explicitWait = new WebDriverWait(driver, TimeSpan.FromSeconds(globalWaitTime));
        driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0.5));
        while (retryCount < retries)
        {
            try
            {
                explicitWait.Until<bool>((d) =>
                {
                    try
                    {
                        if (Equals(d.FindElement(locator1).Text, expectedText1)) { returnText = return1Ident; };
                    }
                    catch (NoSuchElementException)
                    {
                        if (Equals(d.FindElement(locator2).Text, expectedText2)) { returnText = return2Ident; };
                    }
                    return (returnText != "");
                });
                return Tuple.Create(true, returnText);
            }
            catch (StaleElementReferenceException e)
            {
                Console.Out.WriteLine(DateTime.UtcNow.ToLocalTime().ToString() +
                    ":>>> -" + locator1.ToString() + " OR " + locator2.ToString() + "- <<< - " +
                    this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name +
                    " : " + e.Message);
                retryCount++;
            }
        }
        return Tuple.Create(false,"");
    }

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

person gramdocmail    schedule 09.06.2014