Как правильно написать переключатель чытобы не было ошибки?

selenium
webdriver
testng
Теги: #<Tag:0x00007fedb9709a78> #<Tag:0x00007fedb97098e8> #<Tag:0x00007fedb9709708>

(Вова Черепок) #1

Метод проходит две стриницы, на одной нужный элемент можно найти по
var navigationElements = driver.FindElements(By.XPath("//li[@class=‘selected’]//a"));

на другой странице нужно взять элемент по такому:
var navigationElements = driver.FindElements(By.XPath(".//*[@class=‘headline’]"));

Как написать правильно переключатель чтобы не вылетал эксепшн?
Помогите пожалуйста


(Ray Romanov) #2

через try catch


(Вова Черепок) #3

try
{
var navigationElements = driver.FindElements(By.XPath("//li[@class=‘selected’]//a"));
}
catch (NoSuchElementException) { }
try
{
var navigationElements = driver.FindElements(By.XPath(".//*[@class=‘headline’]"));
}
catch (Exception) { }

пробовал, после try/catch стоит переменная category, которая использует navigationElements из блока try
var category = UppercaseWords(navigationElements[0].Text.ToLower());

оно светится красным и не может сослаться на содержимое блока try


(brbrr) #4

По класике FindElements возвращает масив. Если он ничего не находит - масив пустой. проверяйте его на наличие елементов.


(Ray Romanov) #5
try
{
     var navigationElements = driver.FindElement(By.XPath("//li[@class='selected']//a"));
}
catch (NoSuchElementException) { }
{
     var navigationElements = driver.FindElement(By.XPath(".//*[@class='headline']"));
}

(Dzmitry Ihnatsyeu) #6

решение довольно спорное использовать try catch - семантика данного механизма нужна чтобы обрабатывать ситуации исключительные, которые не должны возникнуть при нормальном функционировании программы. А вы вполне себе ожидаете что на 2 разных страницах элемент будет найден по 2ум разным локаторам. Инкапсулируйте разные локаторы в самих объектах страниц и используйте полиморфизм для получения элементов. Например,

Class A:
def findNavigationElements():
return navigationElements = driver.FindElements(By.XPath("//li[@class=‘selected’]//a"));
Class B:
def findNavigationElements():
navigationElements = driver.FindElements(By.XPath(".//*[@class=‘headline’]"));


(Вова Черепок) #7

Решил свою проблему добавлением текстового поля, в которое записываю XPATH в зависимости от страницы

string categoryPath = "";
//Jackpots page doesnt has menu, and we need to find category from Headline (comment from below)
if (driver.Url.ToString() == "https://www.caesarscasino.com/en/all-games/jackpots")
{
         categoryPath = ".//*[@class='headline']";
}
else
{
          categoryPath = "//li[@class='selected']//a";
}
 var navigationElement = driver.FindElement(By.XPath(categoryPath));


(Дмитрий Мирошник) #8

ИМХО более корректный вариант использовать Page Object. Почитайте на эту тему.
Ваш код в тесте тогда будет выглядеть где-то так:
myPage1.navigationElements.

myPage2.navigationElements.something

class myPage1 extends Page {
@FindBy (xpath, “//li[@class=‘selected’]//a”)
pageElement navigationElements
}

class myPage2 extends Page {
@FindBy (xpath, “.//*[@class=‘headline’]”)
pageElement navigationElements

}

То решение, которое есть у Вас, при увеличении количества тестов превратится в maintenance hell. Представьте себе, что у Вас добавляется 3-я страница, на которой есть navigationElements. Вам придётся переписывать логику теста при расширении функциональности. Это очень плохой путь. Пока не поздно - исправляйтесь :slight_smile: Я так понимаю, Ваши автотесты находятся в начале своего развития.


(Вова Черепок) #10

Да, в начале) спасибо за PageObject, пойду почитаю о нем