Как динамически находить элементы в селене

В настоящее время в моем драйвере Firefox, если я хочу найти элемент, я пишу код так:

WebDriver firefoxDriver = new FirefoxDriver();

...

firefoxDriver.findElement(By.id("testid")).isDisplayed();

or

firefoxDriver.findElement(By.name("testname")).isDisplayed();

or

firefoxDriver.findElement(By.class("testclass")).isDisplayed();

etc

Однако у меня есть эти элементы на отдельной странице, например:

 @FindBy(id = "testid")
    public WebElement testIdElement;

    @FindBy(name = "testname")
    public WebElement testNameElement;

   @FindBy(class = "testclass")
    public WebElement testClassElement;

Я хочу искать свои элементы, как показано ниже, но ниже не работает, потому что он ожидает By:

firefoxDriver.findElement(elementsPage.testIdElement);

or

firefoxDriver.findElement(elementsPage.testNameElement);

or

firefoxDriver.findElement(elementsPage.testClassElement);

Каков будет лучший способ справиться с этим сценарием? Я действительно не хочу жестко кодировать элементы, вместо этого лучше использовать элементы, которые я уже определил в своем списке элементов.

На это уже ответили. Пожалуйста, посмотрите здесь: stackoverflow.com/questions/18436102/…

Jitendra Singh 15.05.2019 18:59

Возможный дубликат Селен @FindBy против driver.findElement()

Greg Burghardt 15.05.2019 19:27

Вам не нужно искать элементы, они уже найдены... это то, что testIdElement и другие, WebElements. Просто используйте такие, как testIdElement.click() и т. д.

JeffC 17.05.2019 22:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто объявите их как By, как это в вашем pageObject:

public By testIdElement = By.id("testid");

public By testNameElement = By.name("testname");

public By testClassElement = By.className("testclass");

затем вызовите их в методе findelements так, как вы хотите:

firefoxDriver.findElement(elementsPage.testIdElement);

firefoxDriver.findElement(elementsPage.testNameElement);

firefoxDriver.findElement(elementsPage.testClassElement);

лично мне нравится помещать метод driver.findElement в pageObject как лямбда-выражение, чтобы избежать переписывания кода:

что я делаю на С#:

public IWebElement Test => webdriver.FindElement(By.CssSelector("test"));

преобразование в Java:

public WebElement test -> driver.findElement(By.cssSelector("test"));

поэтому написание моего кода будет примерно таким:

page.Test.Click();
page.Test.SendKeys("...");

Поскольку мне не нравится использовать элементы в классе Test, я пишу эти методы в объекте страницы (отделяя логику теста от скрипта), например:

    public PageObjectClassExample ShowFilters()
    {
        showFiltersButton.Click();
        return this;
    }
    public PageObjectClassExample ClearAllFilters()
    {
        finalDatePicker.Clear();
        initialDatePicker.Clear();
        searchButton.Click();
        return this;
    }
    public PageObjectClassExample HideShowIssuerColunm()
    {
        ShowHideColumnBtn.Click();
        IssuerColumnCheck.Click();
        KeyColumnCheck.Click();
        ShowHideColumnBtn.Click();
        return this;
    }

и в тестовом файле я бы написал что-то вроде этого:

PageObjectClassExample page = new PageObjectClassExample();
page
    .ShowFilters()
    .ClearAllFilters()
    .HideShowIssuerColumn();

Спасибо, Валга, могу я попросить вас показать пример того, что вы подразумеваете под этим, пожалуйста? «Мне лично нравится помещать метод driver.findElement в pageObject как лямбда-выражение, чтобы избежать переписывания кода, но каждый по-своему!»

BruceyBandit 15.05.2019 19:34

@BruceyBandit Извините, теперь, когда я прочитал это снова, это звучало плохо, но я не имел в виду ничего плохого, я отредактировал ответ, указав, как я кодирую свои селеновые скрипты.

Valga 15.05.2019 19:54

Другие вопросы по теме