Как обрабатывать динамические элементы в объектной модели страницы в Selenium?

Можно ли обрабатывать динамические элементы в объектной модели страницы?

Пример:

package pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

public class Home_Page {
    WebDriver driver;

    public Home_Page(WebDriver driver) {
        this.driver = driver;
    }

    @FindBy(how=How.XPATH, using = "//input[@name = '%s']")
    public WebElement inputField;
}

Я хочу передать значение входного атрибута имени из моего тестового метода.

package scripts;

@Test
public void test(){
        driver.get("url");
        Home_Page homepage = PageFactory.initElements(driver, Home_Page.class);
        homepage.inputField.sendKeys("xpathParameter", "sendKeysVal"); 
}

person Kass    schedule 31.10.2018    source источник


Ответы (2)


Невозможно реализовать так, как вы хотите, поскольку нет возможности динамически передавать значение в аннотацию в Java - Значения аннотаций Java предоставляются динамически.

Однако вы можете добиться того же, заменив поле класса + аннотацию| с |методом|:

package pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

public class Home_Page {
    WebDriver driver;

    public Home_Page(WebDriver driver) {
        this.driver = driver;
    }

    public WebElement inputField(String name) {
       return this.driver.findElement(String.format(By.xpath("//input[@name = '" + name + "']");
    }
}


package scripts;

    @Test
    public void test(){
        driver.get("http://play.krypton.infor.com");
        Home_Page homepage = PageFactory.initElements(driver, Home_Page.class);
        homepage.inputField("xpathParameter").sendKeys("sendKeysVal"); 
    }
person Vladimir Efimov    schedule 31.10.2018

Что-то в этом роде должно быть полезно, если вы хотите найти элемент, используя findBy, и предоставить pagename динамически.

import org.openqa.selenium.By;
public class CreateLocators {
    public static By buildByObject(String pageName, String fieldName) {
        try {
            Class<?> clas = Class.forName("pageobjects." + pageName);
            Object obj = clas.newInstance();
            return new Annotations(obj.getClass().getDeclaredField(fieldName)).buildBy();
        } catch (NoSuchFieldException e) {
            return null;
        }
    }
}

В StepDef вы должны делать так:

byElem = CreateLocators.buildByObject(pageName, desiredElementNameInPO);
        elem = driver.findElement(byElem);
        elem.click();
person ArmchairGenX    schedule 03.03.2020
comment
так много правил и ограничений в добавлении небольшого фрагмента кода :) Мне потребуется некоторое время, чтобы освоиться - person ArmchairGenX; 03.03.2020
comment
Привет, Дас, есть ли способ предоставить кому-нибудь ссылку на gitlab, чтобы они могли увидеть весь файл проекта? - person ArmchairGenX; 03.03.2020