[Заметка] [C#] Атрибут [FindsBy] в PageObject? – Дайте два!

##Проблема
При прогоне тестов на Selenium WebDriver в разных браузерах, иногда бывают такие мистические проблемы, что локаторы, которые работают в Internet Explorer и Chrome… почему-то перестают работать в PhantomJS, и при этом не всегда, а в момент перехода между страницами…

Я предпочитаю использовать CSS-селекторы. В таких ситуациях, специально для PhantomJS приходится писать XPath, да и не каждый еще подойдет… и по закону подлости… работает только «самый длинный».

А что, если у меня тот же элемент сломается и в FireFox? Можно, конечно же, придумать универсальный локатор, но, иногда, намного легче и эффективней будет использовать 2-3 не универсальных.

Решение

Все очень просто и интуитивно понятно. Но, мало где описано.
Можно использовать два атрибута FindsBy подряд. И поиск вначале будет производится сверху вниз.

Вот пример объявления элемента с двумя атрибутами FindsBy:

    public class MyApplicationPage : BasePage
    {
        [FindsBy(How = How.CssSelector, Using = @"input[onclick*='Calculate']")]
        [FindsBy(How = How.XPath, Using = @"//form[@name='calcform1']/table[1]/tbody[1]/tr[5]/td[2]/input[1]")]
        protected IWebElement btnCalculate { get; set; }
    }

И продолжая эстафету. Известно, что в атрибутах на C# нельзя использовать значения переменных. Но… константы использовать можно, и даже проводить с ними строковые операции.

    public class MyApplicationPage2 : BasePage
    {
        const string prefix = @"//form[@name='calcform1']/table[1]/tbody[1]/tr[5]/td[2]";
        const string element1XPath = prefix + @"/input[1]";
        const string element2XPath = prefix + @"/button[1]";
        
        [FindsBy(How = How.XPath, Using = element1XPath)]
        [FindsBy(How = How.XPath, Using = element2XPath)]
        protected IWebElement btnCalculate { get; set; }
    }
5 лайков

В python реализации такого нет, но можно сделать небольшой примерчик на Python, чтобы показать как это можно реализовать. Ставьте лайки под комментом если надо, тогда напишу новую заметку.

2 лайка

Миша – лайкоголик :smiley:

Выкладывай Gist, как, например, @vmaximv, в прошлой заметке.

чик-чик – и готово

Да я такой, чем больше лайков, тем больше я счастлив :smile:

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

Так что кому нужно пишите, тогда уже целенаправленно выложу.

И спасибо @dzhariy что делишься опытом и пингуешь меня, чтобы я тоже не закисал :slight_smile:

А вообще кстати, прикольная идея, кто-то пишет небольшую заметку на каком-то одном языке программирования, а потом другие подхватывают и показывают аналоги на других языках программирования. Я думаю java, c#, python, ruby нам хватит - это будет покрытие в 95% всех случаев

Будет время, напиши, пожалуйста. А я, если получится, сделаю кейворды для Selenium2Library в RobotFramework (благо, теперь их можно писать с **kwargs)