web-dev-qa-db-fra.com

Cliquez sur le pseudo-élément à l'aide de sélénium

J'essaie d'utiliser Selenium pour cliquer sur un pseudo-élément :: after. Je me rends compte que cela ne peut pas être fait directement via WebDriver, mais je n'arrive pas à trouver un moyen de le faire avec Javascript.

Voici à quoi ressemble le DOM:

<em class="x-btn-split" unselectable="on" id="ext-gen161">
    <button type="button" id="ext-gen33" class=" x-btn-text">
        <div class="mruIcon"></div>
        <span>Accounts</span>
    </button>
    ::after
</em>

Voici à quoi ressemble l'élément ci-dessus. Le côté gauche de l'objet est l'élément 'button' et l'élément: after est le côté droit avec la flèche qui ferait apparaître un menu déroulant lorsque l'utilisateur clique dessus. Comme vous pouvez le constater, le côté droit ne comporte aucun identifiant et c'est en partie ce qui rend cette tâche difficile.

 Element to be clicked

J'ai vu ces deux liens dans stackoverflow et j'ai tenté de combiner les réponses pour former ma solution, mais en vain.

Cliquer sur un élément de Selenium WebDriver à l'aide de JavaScript
Localisation du pseudo-élément dans Selenium WebDriver à l'aide de JavaScript

Voici l'une de mes tentatives:

string script = "return window.getComputedStyle(document.querySelector('#ext-gen33'),':before')";
IJavaScriptExecutor js = (IJavaScriptExecutor) Session.Driver;
js.ExecuteScript("arguments[0].click(); ", script);

Dans lequel je reçois cette erreur:

System.InvalidOperationException: 'unknown error: arguments[0].click is not a function
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 6.1.7601 SP1 x86_64)'

J'ai également essayé d'utiliser la classe Actions dans Selenium pour déplacer la souris par rapport au côté gauche, comme pour cette réponse aussi. Je pense que c'est peut-être parce que je ne sais pas en quoi le décalage est mesuré et la documentation ne semble donner aucune indication. Je pense que c'est en pixels ??

Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(235, 15).Click().Build().Perform();

Cette tentative semble cliquer quelque part car elle ne génère aucune erreur, mais je ne sais pas trop où.

J'essaie d'automatiser Salesforce (Service Cloud) en c # si cela peut vous aider.

Peut-être que quelqu'un peut offrir une solution? 

6
Jand

J'ai rencontré le même problème lors de l'écriture de tests Selenium pour Salesforce et j'ai réussi à le résoudre en contrôlant directement la souris à l'aide d'Actions.

La table d'emballage pour ce bouton a une largeur codée en dur de 250 pixels, et vous l'avez remarquée. Pour localiser l'emplacement de la souris, vous pouvez utiliser la méthode contextClick() à la place de Click().. Le bouton droit de la souris est simulé de sorte qu'il ouvre toujours le menu du navigateur.

Si tu fais:

Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).ContextClick().Build().Perform();

vous remarquerez que la souris se déplace au milieu de l'élément Web, pas dans le coin supérieur gauche (je pensais que c'est le cas également). Puisque la largeur de cet élément est constante, nous pouvons déplacer la souris de 250 / 2 - 1 à droite et cela fonctionnera:) Code:

Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(124, 0).Click().Build().Perform();
5
Maciej Podstawka

Pour ceux qui essaient de le faire en Python, la solution est la suivante:

elem= driver.<INSERT THE PATH TO ELEMENT HERE> ActionChains(driver).move_to_element_with_offset(elem,249,1).click().perform()

En gros, ici, je trouve mon élément dans le DOM et l’assignation à un WebElement. La méthode move_to_element_with_offset est ensuite transmise au WebElement en tant que paramètre.

J'ai obtenu les valeurs px pour l'élément à partir d'outils de développement.

PS: utilisez cette importation depuis Selenium.webdriver.common.action_chains pour importer ActionChains

Vous pouvez en savoir plus sur Action chain} class et sa méthode move_to_element_with_offset ici: http://Selenium-python.readthedocs.io/api.html .

J'espère que cela t'aides.

2
AmrithS

La réponse de Maciej'a ci-dessus fonctionnait avec WebDriver, mais pas avec RemoteWebDriver (Selenium 3.12.0) avec Firefox V.56. Nous avions besoin d'une solution qui fonctionne à la fois localement et à distance. Nous avons fini par utiliser des raccourcis clavier pour appeler le menu déroulant du menu de navigation. En outre, cela évite d'avoir à utiliser des compensations.

String navigationMenuDropdownShortcutKeys = Keys.chord(Keys.ESCAPE, "v");

new Actions(driver)
 .sendKeys(navigationMenuDropdownShortcutKeys)
 .perform();
1
perNalin