##Проблема
При прогоне тестов на 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; }
}