http://www.unit-testing.net/CurrentArticle/How-To-Write-XPath-for-Selenium-Tests.html

пользуем Selenium для тестирования пользовательского интерфейса нашего приложения ASP.NET. Во многих тестовых примерах тестируются более длинные потоки, занимающие несколько страниц.

Я обнаружил, что тесты очень хрупкие, они ломаются не только из-за изменений кода, которые фактически меняют страницы, но и из-за безобидных рефакторингов, таких как переименование элемента управления (так как мне нужно передать clientID элемента управления в метод Click в Selenium и т. Д.) Или замена сетка с ретранслятором. В результате я теряю время на обновление строковых значений в моих тестовых примерах, чтобы исправить сломанные тесты.

Есть ли способ написать более приемлемые тесты Selenium? Или лучший инструмент для тестирования веб-интерфейса?

Отредактировано, чтобы добавить: Обычно первый черновик создается путем записи теста в IDE. (Этот первый шаг может выполнить персонал QA.) Затем я выполняю рефакторинг сгенерированного кода C # (извлечение констант, извлечение методов для повторного кода, возможно повторение контрольного примера с другими данными и т. Д.). Но общий поток кода для каждого теста остается достаточно близким к изначально сгенерированному коду.

Ответы на вопрос(7)

что использование выражений XPath в Selenuium-RC значительно повышает надежность теста.

Я пишу свои тесты аналогичным образом. Первый проход часто пишется через IDE / Record, чтобы получить большую часть моего потока страниц и операций кликов. Получив это, я начинаю проходить тест через Selenium-RC, добавляя утверждения и меняя абсолютные локаторы виджетов на более удобочитаемые и удобные выражения Xpath. (а также документирование теста! :))

Следует помнить одну вещь: если ваши тесты сильно загружены xpath, они могут работать немного медленнее в IE6 из-за его плохих способностей выполнения javascript. (У меня есть несколько наборов тестов, которые выполняются под IE почти на час дольше, чем под FF. Это управляемо, но просто нужно помнить, когда вы пишете тесты.)

записывая и воспроизводя их? Что мы сделали, так это построили объектную модель вокруг страниц, чтобы вы вызывали метод, подобный «clickSubmit ()», а не щелкали по идентификатору (с соглашением об именовании для этих идентификаторов), что позволяет тестам селена выдерживать многие изменения.

 Helen Toomik21 янв. 2009 г., 21:52
Можете ли вы показать пример?
Решение Вопроса

http://code.google.com/p/webdriver/wiki/PageObjects

больше информации: -Какой смысл селена? - Селен Критика

может быть, хороший способ начать - это поэтапный рефакторинг ваших тестовых случаев.

Я использую тот же сценарий, у вас есть селен + C #

Вот как выглядит мой код:

Тестовый метод будет выглядеть примерно так
    [TestMethod]
    public void RegisterSpecialist(UserInfo usrInfo, CompanyInfo companyInfo)
    {
        var RegistrationPage = new PublicRegistrationPage(selenium)
              .FillUserInfo(usrInfo)
              .ContinueSecondStep();
        RegistrationPage.FillCompanyInfo(companyInfo).ContinueLastStep();
        RegistrationPage.FillSecurityInformation(usrInfo).ContinueFinishLastStep();
        Assert.IsTrue(RegistrationPage.VerifySpecialistRegistrationMessagePayPal());
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        paypal.LoginSandboxPage(usrInfo.sandboxaccount, usrInfo.sandboxpwd);
        Assert.IsTrue(paypal.VerifyAmount(usrInfo));
        paypal.SubmitPayment();
        RegistrationPage.GetSpecialistInformation(usrInfo);
        var bphome = new BPHomePage(selenium, string.Format(Resources.GlobalResources.LoginBPHomePage, usrInfo.AccountName, usrInfo.Password));
        Assert.IsTrue(bphome.VerifyPageWasLoaded(usrInfo));
        Assert.IsTrue(bphome.VerifySpecialistProfile());
        bphome.Logout();
    }
Объект страницы будет примерно таким
public class PublicRegistrationPage
{
    public ISelenium selenium { get; set; }

    #region Constructors
    public PublicRegistrationPage(ISelenium sel)
    {
        selenium = sel;
        selenium.Open(Resources.GlobalResources.PublicRegisterURL);
    }
    #endregion
    #region Methods

    public PublicRegistrationPage FillUserInfo(UserInfo usr)
    {
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserFirstName", usr.FirstName);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserLastName", usr.LastName);
        selenium.Select("ctl00_cphComponent_ctlContent_wizRegister_ddlUserCountry", string.Format("label={0}",usr.Country ));
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserEmail", usr.Email );
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserDirectTel", usr.DirectTel);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserMobile", usr.Mobile);
        return this;
    }

}

Надеюсь это поможет.

 MariangeMarcano18 июл. 2009 г., 16:44
Приятно знать, что эта работа поможет вам :)
 Helen Toomik15 июл. 2009 г., 21:28
Спасибо за исчерпывающий пример! Под влиянием ответа циника и под влиянием вики-страницы Google я уже провела рефакторинг своего тестового кода и в результате получила нечто очень похожее.

что Xpath - лучший способ обеспечить надежные тесты селена. В настоящее время я работаю над библиотекой, чтобы облегчить написание выражений xpath.

Если вы заинтересованы, вы можете проверить это здесь:http://www.unit-testing.net/CurrentArticle/How-To-Write-XPath-for-Selenium-Tests.html

которые устойчивы к рефакторингу. Вот как сделать рефакторинг менее болезненным: постоянная интеграция необходима.

Запускайте их каждый день или каждую сборку. Чем раньше это будет исправлено, тем легче.

Убедитесь, что разработчики могут сами запускать тесты. Опять же, чем раньше это увидят и исправят, тем легче.

Держите тесты селена немного. Они должны сосредоточиться на критических сценариях тестирования пути / pri 1. Глубокое тестирование должно проводиться на уровне юнит-тестов (или тестов jsunit). Интеграционные тесты всегда дороги и менее ценны.

когда речь заходит об автоматизации тестирования;)

Мы используемФреймворк SAFS с Rational Robot (RRAFS), чтобы минимизировать влияние на наши скрипты автоматизации. Есть еще работа по поддержанию карты приложения, но скрипты по большей части остаются стабильными. Инфраструктура SAFS очень похожа на метод, о котором упоминает cynicalman, но уже упаковывает универсальные методы, которые вы бы использовали в своих скриптах.

Сайт SAFS говорит, что есть частичная поддержка Selenium, так что это может сработать для вас.

Элемент пользовательского интерфейса (документацияВот).

Особенности будут

абстрактные локаторы, независимые от самой реализации html; это будет соответствовать концепции компонента или виджета веб-фреймворка,

правила объединения, позволяющие объединить несколько команд в одну более абстрактную команду.

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

некоторые концепции, такие как концепция смещенных локаторов (воспринимайте их как части компонента), разработаны не полностью или бесполезно;эта функция не полностью поддерживается в форматировщиках, и чем новее форматировщик, тем меньше эта функция поддерживается, намекая на то, что ядро ​​Selenium evolution оставляет эту функцию позади;он не полностью интегрирован в Selenium 2.0 (WebDriver).

Ваш ответ на вопрос