Получить по локатору уже найденного WebElement

есть ли элегантный способ получить локатор Селена WebElement, который я уже нашел / идентифицировал?

чтобы быть ясным в вопросе: я хочу, чтобы "по локатору", как используется для поиска элемента. Я в этом случае не интересует конкретный атрибут или конкретный локатор, такой как css-locator.

Я знаю, что могу проанализировать результат метода toString() WebElement:

WebElement element = driver.findElement(By.id("myPreciousElement"));
System.out.println(element.toString());

выход бы пример:

[[FirefoxDriver: firefox на WINDOWS (....)]- >id: myPreciousElement]

Если вы нашли свой элемент xpath:

WebElement element = driver.findElement(By.xpath("//div[@someId = 'someValue']"));
System.out.println(element.toString());

тогда ваш выход будет:

[[FirefoxDriver: firefox на WINDOWS (....)]- >xpath: / / div[@someId = 'someValue']]

поэтому я в настоящее время написал свой собственный метод, который анализирует этот вывод и дает мне "воссозданный" локатор.


но есть ли более элегантный способ, уже реализованный в Selenium, чтобы получить локатор, используемый для поиска элемента?

я не мог найти его до сих пор.

Если вы уверены, что нет ни одного из коробки, можете ли вы подумать о какой-либо причине, почему создатели API не могут предоставить эту функциональность?



* Несмотря на то, что это не имеет ничего общего с вопросом, если кто-то задается вопросом, почему вы всегда нужна эта функциональность, всего 2 примера:

  • если вы используете PageFactory, у вас, скорее всего, не будет локаторов как переменных-членов в вашем классе страницы, но они могут понадобиться позже при работе с элементами страницы.
  • вы работаете с API людей, которые просто используют шаблон объекта страницы без PageFactory и, таким образом, ожидают, что вы передадите локаторы вместо самого элемента.*

3 ответов


ответ нет. Вы не можете извлечь By из ранее найденного WebElement по умолчанию.

это, как говорится, можно реализовать пользовательское решение, но Selenium не предлагает это из коробки.

рассмотрим следующее, На "почему"..

By by = By.id("someId");
WebElement e = driver.findElement(by);

у вас уже есть By объект, поэтому вам не нужно будет вызывать что-то вроде e.getBy()

Я мог бы реализовать что-то подобное в будущем, но не обещает выделить. Опять же - это просто сахар.


нет, нет. Я реализовал решение в качестве прокси-сервера:

public class RefreshableWebElement implements WebElement {

    public RefreshableWebElement(Driver driver, By by) {
        this.driver = driver;
        this.by = by;
    }

    // ...

    public WebElement getElement() {
        return driver.findElement(by);
    }

    public void click() {
        getElement().click();
    }

    // other methods here
}

для меня работал с commons-lang3

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

для удаленного веб-элемента используйте метод, например:

protected String getLocator(WebElement element) {
        try {
            Object proxyOrigin = FieldUtils.readField(element, "h", true);
            Object locator = FieldUtils.readField(proxyOrigin, "locator", true);
            Object findBy = FieldUtils.readField(locator, "by", true);
            if (findBy != null) {
                return findBy.toString();
            }
        } catch (IllegalAccessException ignored) {
        }
        return "[unknown]";
    }