web-dev-qa-db-fra.com

Obtenir le localisateur Par d'un élément Web déjà trouvé

Existe-t-il un moyen élégant d'obtenir le Par la localisation d'un Selenium WebElement, que j'ai déjà trouvé/identifié?

Pour être clair sur la question: je veux le "Par localisateur" comme utilisé pour trouver l'élément. Je suis dans ce cas pas intéressé par un attribut spécifique ou un localisateur spécifique comme le localisateur css. 

Je sais que je pourrais analyser le résultat de la méthode toString () de WebElement:

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

La sortie serait par exemple:

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

si vous avez trouvé votre élément par xpath:

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

Ensuite, votre sortie sera:

[[FirefoxDriver: firefox sous WINDOWS (....)] -> xpath: // div [@someId = 'uneValeur']]

J'ai donc actuellement écrit ma propre méthode qui analyse cette sortie et me donne le "recréé" Par locator.


MAISexiste-t-il déjà une méthode plus élégante que Selenium pour obtenir le localisateur By utilisé pour rechercher l'élément?

Je ne pouvais pas en trouver un si loin.

Si vous êtes certain qu'il n'y en a pas, pouvez-vous imaginer une raison pour laquelle les créateurs d'API pourraient ne pas fournir cette fonctionnalité?



* Malgré le fait que cela n’a rien à voir avec la question, si quelqu'un se demande pourquoi vous auriez besoin de cette fonctionnalité, il suffit de deux exemples: 

  • si vous utilisez PageFactory, vous n'aurez probablement pas les localisateurs comme variables membres dans votre classe Page, mais vous pourriez en avoir besoin ultérieurement lorsque vous travaillerez avec les éléments de la page. 
  • vous travaillez avec des API de personnes n'utilisant que le modèle d'objet de page sans PageFactory et vous attendez donc à ce que vous leur remettiez des localisateurs au lieu de l'élément lui-même. *
13
drkthng

La réponse est non . Vous ne pouvez pas extraire une By à partir d'un WebElement précédemment trouvé.

Cela dit, il est possible de mettre en œuvre une solution personnalisée, mais Selenium ne propose pas cette solution prête à l'emploi.

Considérez ce qui suit sur "pourquoi" ..

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

vous avez déjà l'objet By, vous n'avez donc pas besoin d'appeler quelque chose comme e.getBy()

Je pourrais mettre en œuvre quelque chose comme ça à l'avenir, mais pas de promesses. Encore une fois - c'est juste du sucre.

6
sircapsalot

Non, il n'y en a pas. J'ai implémenté une solution possible en tant que proxy:

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
}
5
Zymus

Pour moi a travaillé avec commons-lang3

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

Pour les éléments Web distants, utilisez la méthode suivante:

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]";
    }
1
alexloiko