Передать значение в xpath во время выполнения

Пожалуйста, прочтите вопрос до конца, прежде чем что-то отрицать или комментировать. Я искал в Интернете, прежде чем публиковать его здесь. У меня есть структура проекта ниже.

pages(package)
    > Homepage.java
test(package)
    > Flipkart.java 

Внутри Homepage.java я объявил все WebElements, используя методы POM Page Factory, и создал соответствующий метод для перехода по ссылке Electronics.

@FindBy(xpath = '//input[@title='Electronics']')
private WebElement lnkElectronics;

Внутри Fipkart.java я вызываю метод щелчка Electronics.

Я сомневаюсь, что заявленный WebElement предназначен специально для электроники.

Есть ли способ создать WebElement с указанным ниже типом и динамически передать значение для %s из основного метода?

@FindBy(xpath = '//input[@title='%s']')
private WebElement lnkElectronics;

person Sandeep Raulo    schedule 14.03.2018    source источник
comment
Нет, если вы хотите использовать аннотацию FindBy, для которой требуется постоянное значение. Один из возможных обходных путей — вместо этого создать список WebElements, если вы можете сузить их до тех, которые вам нужны, и написать метод в классе вашей страницы для передачи параметра и поиска этого конкретного элемента в массиве.   -  person Bill Hileman    schedule 14.03.2018


Ответы (3)


Ответ со ссылкой на Объектная модель страницы в Selenium

Вы не можете создать FindBy с переменной, FindBy принимает только константы.

В случае, если вы хотите добиться этой изменчивости, вам следует написать или найти элемент, используя обычный метод findElement.

person PAVAN KUMAR N    schedule 15.03.2018

В соответствии с Соображениями по разработке тестов в соответствии с Шаблон проектирования объектов страницы :

  • Объект страницы — это объектно-ориентированный класс, который служит интерфейсом к странице Тестируемого приложения. Ваш @Tests использует методы этого класса Page Object всякий раз, когда им нужно взаимодействовать с Пользовательским интерфейсом этой страницы. Преимущество в том, что если пользовательский интерфейс изменится для страницы, вам не нужно будет менять @Tests себя. Необходимо изменить только код внутри Объекта страницы.

    Преимущества :

    • Clean separation between test code and page specific code such as locators, methods and layout.
    • Единый репозиторий для операций, предлагаемых страницей, а не разбросанных по всем тестам.

На основе этих функций Page Factory вы не сможете создать какой-либо общий WebElement, для которого вы можете динамически передавать значение из main() или @Test с аннотациями. метод напр.

@FindBy(xpath = '//input[@title='%s']')
private WebElement lnkElectronics;

Вы можете найти почти аналогичное обсуждение в Где я должен определить модальный код в шаблоне объектной модели страницы Selenium

person DebanjanB    schedule 14.03.2018

WorkAround: в классе страницы вы можете определить метод и передать текст на лету из вызывающего класса, чтобы щелкнуть определенную вкладку

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

  public void clickTab(String tabText){
       String tabxpath = "//div[contains(text(), '" + tabText + "')]";
       driver.findElement(By.xpath(tabxpath)).click();

   }
person Arpan Saini    schedule 25.11.2018