Comment sélectionner un lien avec Selenium Webdriver?
Le sélénium avant serait fait par:
Selenium.click("link=Users");
Mais comment puis-je faire la même chose avec webdriver?
Je pensais à
driver.findElement(By.partialLinkText("Users")).click();
mais ça ne marche pas. Aucun lien n'est cliqué!
<html>
<body>
<div id="mainpage" class="mainpage">
<div id="pageid" class="pageid">
<div id="body">
<table>
<tbody>
<tr>
<td>
<table>
<tbody>
<tr>
<td>
<div id="id_menu" class="mymenu">
<ul>
<li class="li_class ">
<a href="/user.xhtml">Users</a>
trace de la pile:
org.openqa.Selenium.NoSuchElementException: Unable to locate element:
{"method":"partial link text","selector":"Users"} Command duration or timeout: 11.36
seconds For documentation on this error, please visit: http://seleniumhq.org/exceptions
/no_such_element.html Build info: version: '2.24.1', revision: '17205', time: '2012-06-19
17:28:14' System info: os.name: 'Windows XP', os.Arch: 'x86', os.version: '5.1',
Java.version: '1.7.0_02' Driver info: driver.version: RemoteWebDriver Session ID:
178449d1-4ff3-44f3-b35c-6a158db7c430 error at line: 34
XPath est l’un des moyens les plus précis de pointer l’élément.
Essaye ça:
driver.findElement(By.XPath("//li[@class='li_class']/a")).Click();
Cela devrait fonctionner:
driver.findElement(By.LinkText("Users")).click();
Par LinkText est possible
Utiliser un sélecteur CSS:
a[href*=user.xhtml]
Voici quelques conseils pour écrire cssSelector
= --> Equals string
^= --> Starts with string
$= --> Ends with string
*= --> Contains
~= --> Contains in a list
Je suis d’accord avec Christoph - Le texte de Link devrait fonctionner. Mais j’adopte une approche différente qui fonctionne tout le temps pour moi.
Tous les éléments que j'ai besoin de localiser ou de sélectionner, je leur attribue un identifiant (sans CSS, il n'y aurait aucune différence de vue). Cela aide à la lisibilité de mes cas de test, à l'écriture de fonctions générales et à l'amélioration de la maintenabilité du code. Seulement pour le code généré dynamiquement ou les endroits où je ne peux pas utiliser id, je choisis une approche différente.
Dans mon cas, chromedriver n'est pas autorisé à cliquer sur le lien. J'ai pu résoudre ce problème en utilisant:
if(driver.toString().contains("chrome")) {
WebElement form=driver.findElement(By.id("form_id"));
((JavascriptExecutor)driver)
.executeScript("arguments[0].setAttribute('style', 'display: block;')", form); //here I change visibility of element
}
Je pense que ça va marcher:
driver.findElement(By.xpath("//a[@href='/user.xhtml']")).click();
J'ai également eu le problème que LinkText et LinkPartialText ne fonctionnaient pas. C’est parce que j’ai utilisé alors le pilote HTMLUnit. En utilisant FireFox, les deux méthodes fonctionnent bien.
J'ai eu un problème similaire en utilisant PHP Webdriver. LinkText ou partialLinkText ne fonctionnaient pas, mais le texte fourni pour la recherche était égal à cela dans le code SOURCE. (Disons que c'était le texte du lien: "Utilisateurs")
Je me gratifiais la tête pourquoi cela ne fonctionnait pas, alors que partout ailleurs c'était. Puis j'ai vu la différence. En fait, dans le code source, le texte du lien était Utilisateurs, mais à l'écran, il a été modifié par css text-transform en minuscule; il était donc affiché comme "utilisateurs". Lorsque j'ai changé mes critères de recherche d'utilisateurs en utilisateurs, cela a fonctionné comme un mal!
Alors rappelez-vous - webdriver fonctionne réellement sur les données qu’il voit. Je ne savais pas que c'est sensible à la casse! Mais cela a réellement fonctionné et résolu mon problème. À votre santé!