web-dev-qa-db-fra.com

Façon correcte de focaliser un élément dans Selenium WebDriver en utilisant Java

Quel est l'équivalent de Selenium.focus() pour WebDriver?

element.sendKeys("");

ou

new Actions(driver).moveToElement(element).perform();

J'ai essayé les deux et ils ont fonctionné, mais lequel travaillerait toujours sur tous les éléments?

Quelle est la bonne manière pour les éléments (tels que bouton, lien, etc.)? Cela compte pour moi car la fonction sera utilisée sur différentes interfaces utilisateur.

47
questions

Le code suivant -

element.sendKeys("");

essaie de trouver une boîte de saisie pour saisir des informations, tandis que

new Actions(driver).moveToElement(element).perform();

est plus approprié car cela fonctionnera pour les éléments d’image, les éléments de lien, les listes déroulantes, etc.

Par conséquent, l'utilisation de la méthode moveToElement () a plus de sens pour se concentrer sur tout élément WebElement générique sur la page Web.

Pour une zone de saisie, vous devrez click () sur l'élément à focaliser.

new Actions(driver).moveToElement(element).click().perform();

tandis que pour les liens et les images, la souris sera au-dessus de cet élément particulier, vous pouvez décider de cliquer () dessus en fonction de ce que vous voulez faire.

Si le clic () sur une balise d'entrée ne fonctionne pas -

Puisque vous voulez que cette fonction soit générique, vous devez d’abord vérifier si le webElement est une balise d’entrée ou non -

if("input".equals(element.getTagName()){
   element.sendKeys("");
} 
else{
   new Actions(driver).moveToElement(element).perform();

}

Vous pouvez effectuer des modifications similaires en fonction de vos préférences.

53
Hari Reddy

Vous pouvez utiliser JS comme ci-dessous:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");
13
Ripon Al Wasim

Le focus ne fonctionne que si la fenêtre est focalisée.

Utilisation ((JavascriptExecutor)webDriver).executeScript("window.focus();"); être sûr.

2
theeuller

FWIW, j'ai eu ce que je pense est un problème connexe et est venu avec une solution de contournement: j'ai écrit une Chrome Extension qui a fait un document.execCommand ('coller') dans une zone de texte en mettant l'accent sur la fenêtre décharger afin de remplir l'élément avec le contenu du presse-papiers du système, ce qui a fonctionné manuellement à 100%, mais execCommand a renvoyé la valeur false presque tout le temps lorsqu'elle a été exécutée sous Selenium.

J'ai ajouté un driver.refresh () après le driver.get initial (myChromeExtensionURL), et maintenant cela fonctionne 100% du temps. C'était avec les versions 2.16.333243 du pilote Selenium et Chrome version 43 sur Mac OS 10.9.

Lors de mes recherches sur le problème, je n'ai vu aucune mention de cette solution de contournement. Je pensais donc documenter ma découverte pour les personnes qui suivaient dans mes traces Selenium/focus/execCommand ("coller").

1
Polly

Ce code ne fournit pas réellement le focus:

new Actions(driver).moveToElement(element).perform();

Il fournit un effet de survol.

De plus, le code JS .focus () nécessite que la fenêtre soit active pour fonctionner.

js.executeScript("element.focus();");

J'ai trouvé que ce code fonctionne:

element.sendKeys(Keys.SHIFT);

Pour mon propre code, j'utilise les deux:

element.sendKeys(Keys.SHIFT);
js.executeScript("element.focus();");
1
JohnP2

Nous pouvons également nous concentrer sur webelement en utilisant le code ci-dessous:

public focusElement(WebElement element){
    String javaScript = "var evObj = document.createEvent('MouseEvents');"
                    + "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);"
                    + "arguments[0].dispatchEvent(evObj);";

            ((JavascriptExecutor) getDriver()).executeScript(javaScript, element);
}

J'espère que ça aide :)

0
user3181500