Как получить локатор текущего веб-элемента? - PullRequest
0 голосов
/ 09 января 2020

Требуется получить локатор (By) текущего веб-элемента.

Для моего проекта я использую пользовательские элементы. Так что для элемента HTML select будет класс SelectElement, а для элемента HTML будет класс OptionElement.

Для реализации пользовательских элементов я использую класс CustomWebElement из этот репозиторий: https://github.com/JulHorn/java_selenium_custom_elements

Я хотел бы получить selectElementInstance.getOptions(), который должен отчасти вернуть List<OptionElement>, а не List<WebElement>.

Так вот что Я пытаюсь сделать:

1) Я получаю List<WebElement> с использованием метода findElements(...).

2) В этом списке я повторяю элемент один за другим.

3) Какое бы WebElement я ни получил, я хочу получить экземпляр By для этого элемента.

4) С помощью экземпляра By в наличии и экземпляра WebDriver я уже могу создать пользовательский элемент используя конструктор super(WebDriver driver, By by).

Ниже я привел пример кода:

List<WebElement> myList = driver.findElement(By.xpath("//select[@id ='abcd']/*"));
ListIterator<WebElement> simpleChildIterator = myList.listIterator();
List<OptionElement> options = new ArrayList<OptionElement>();
while(simpleChildIterator.hasNext())
{
    By l = simpleChildIterator.next().getBy();//I want locator for same element
    //Here I can now create Instance of OptionElement to add to List<OptionElement>
    OptionElement o = new OptionElement(driver, l);
    options.add(o);
}

Обратите внимание, что при использовании реализации OptionElement extends CustomWebElement в Page Object в строках с PageFactory , следующее работает абсолютно нормально для меня.

@findBy(xpath = "//select[@id ='abcd']/*")
List<OptionElement> options;

Но это работает из-за магнита PageFactory я c, который подключается через initElements() вызов.

Я хочу, чтобы то же самое работало без участия PageFactory, когда я хочу определить новый метод List<OptionElement> getOptions() в моем SelectElement классе.

Я надеюсь, что вопрос ясен теперь, когда у меня есть сделал несколько правок.

Спасибо @Muzzamil за предложение, что WebDriver должен быть одноразовым. Я удалил это из моего вопроса. Также спасибо @Pranav, чтобы проиллюстрировать мою проблему с элементами select и option. Это лучший пример для объяснения.

Ответы [ 2 ]

3 голосов
/ 09 января 2020

Так что в основном вам нужен элемент By из webElement. Вы можете попробовать это:

private By getByFromElement(WebElement element) {

    By by = null;
    String[] selectorWithValue= (element.toString().split("->")[1].replaceFirst("(?s)(.*)\\]", "$1" + "")).split(":");

    String selector = selectorWithValue[0].trim();
    String value = selectorWithValue[1].trim();

    switch (selector) {
        case "id":
            by = By.id(value);
            break;
        case "className":
            by = By.className(value);
            break;
        case "tagName":
            by = By.tagName(value);
            break;
        case "xpath":
            by = By.xpath(value);
            break;
        case "cssSelector":
            by = By.cssSelector(value);
            break;
        case "linkText":
            by = By.linkText(value);
            break;
        case "name":
            by = By.name(value);
            break;
        case "partialLinkText":
            by = By.partialLinkText(value);
            break;
        default:
            throw new IllegalStateException("locator : " + selector + " not found!!!");
    }
    return by;
}
0 голосов
/ 09 января 2020

Хорошо, так вот ОЧЕНЬ грязное решение - пожалуйста, НЕ используйте это в работе, но просто как идею для вашего конкретного c вопроса: Итак, сначала вы можете создать класс для веб-драйвера:

public class WebDr {

    private ChromeDriver driver;

    public WebDr(ChromeDriver driver) {
        this.driver = driver;
    }

    public void get(final String url) {
        this.driver.get(url);
    }

    public WebEl getElem(By by) {
        return new WebEl(driver.findElement(by), this.driver);
    }
}

Кроме того, вот класс для WebElement:

public class WebEl {

    private WebElement elem;
    private WebDriver driver;

    public WebEl(WebElement elem, WebDriver driver) {
        this.elem = elem;
        this.driver = driver;
    }

    public WebDriver getDriver() {
        return this.driver;
    }
}

Наконец, в вашем коде вы можете сделать следующее:

public class MainCl {

    public static void main(String[] args) throws Exception {
        System.setProperty("webdriver.chrome.driver", "C:\\***\\chromedriver.exe");
        WebDr driver = new WebDr(new ChromeDriver());

        driver.get("https://www.google.com/");


        Thread.sleep(5000);
        WebEl myElem = driver.getElem(By.name("q"));
        System.out.println(myElem.getDriver());

    }
}

И, конечно, то же самое можно сделать для список WebEl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...