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.
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:
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.
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
}
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]";
}