web-dev-qa-db-fra.com

Comment utiliser JavaScript avec Selenium WebDriver Java

Je souhaite utiliser JavaScript avec WebDriver (Selenium 2) à l'aide de Java.

J'ai suivi un guide et à la page Getting Started : il y a une instruction à la première ligne pour s'exécuter en tant que:

$ ./go webdriverjs

Ma question: À partir de quel dossier/emplacement la commande mentionnée ci-dessus sera exécutée/exécutée?

41
Ripon Al Wasim

Sur la base de vos questions précédentes, je suppose que vous souhaitez exécuter des extraits JavaScript à partir de la variable WebDriver de Java. Corrigez-moi si j'ai tort, s'il-vous plait.

La WebDriverJs est en réalité "juste" une autre liaison de langage WebDriver (vous pouvez écrire vos tests en Java, C #, Ruby, Python, JS et peut-être même dans d'autres langues à partir de maintenant). Celui-ci, en particulier, est JavaScript et vous permet donc d'écrire des tests en JavaScript.

Si vous souhaitez exécuter du code JavaScript dans Java WebDriver, procédez comme suit:

WebDriver driver = new AnyDriverYouWant();
if (driver instanceof JavascriptExecutor) {
    ((JavascriptExecutor)driver).executeScript("yourScript();");
} else {
    throw new IllegalStateException("This driver does not support JavaScript!");
}

J'aime faire ça aussi:

WebDriver driver = new AnyDriverYouWant();
JavascriptExecutor js;
if (driver instanceof JavascriptExecutor) {
    js = (JavascriptExecutor)driver;
} // else throw...

// later on...
js.executeScript("return document.getElementById('someId');");

Vous pouvez trouver plus de documentation sur ce ici, dans la documentation , ou de préférence, dans les JavaDocs de JavascriptExecutor .

La executeScript() accepte également les appels de fonction et les fichiers JS bruts. Vous pouvez return une valeur à partir de celle-ci et vous pouvez lui passer beaucoup d'arguments compliqués, quelques exemples aléatoires:

  1. // returns the right WebElement
    // it's the same as driver.findElement(By.id("someId"))
    js.executeScript("return document.getElementById('someId');");
    
  2. // draws a border around WebElement
    WebElement element = driver.findElement(By.anything("tada"));
    js.executeScript("arguments[0].style.border='3px solid red'", element);
    
  3. // changes all input elements on the page to radio buttons
    js.executeScript(
            "var inputs = document.getElementsByTagName('input');" +
            "for(var i = 0; i < inputs.length; i++) { " +
            "    inputs[i].type = 'radio';" +
            "}" );
    
114
Petr Janeček

JavaScript avec Selenium WebDriver

Selenium est l’une des suites de tests automatisés les plus populaires. Selenium est conçu pour prendre en charge et encourager les tests d’automatisation des aspects fonctionnels des applications Web et d’un large éventail de navigateurs et de plates-formes.

    public static WebDriver driver;
    public static void main(String[] args) {
        driver = new FirefoxDriver(); // This opens a window    
        String url = "----";


        /*driver.findElement(By.id("username")).sendKeys("yashwanth.m");
        driver.findElement(By.name("j_password")).sendKeys("yashwanth@123");*/

        JavascriptExecutor jse = (JavascriptExecutor) driver;       
        if (jse instanceof WebDriver) {
            //Launching the browser application
            jse.executeScript("window.location = \'"+url+"\'");
jse.executeScript("document.getElementById('username').value = \"yash\";");
// Tag having name then
driver.findElement(By.xpath(".//input[@name='j_password']")).sendKeys("admin");


//Opend Site and click on some links. then you can apply go(-1)--> back  forword(-1)--> front.
//Refresheing the web-site. driver.navigate().refresh();            
jse.executeScript("window.history.go(0)");
            jse.executeScript("window.history.go(-2)");
            jse.executeScript("window.history.forward(-2)");

            String title = (String)jse.executeScript("return document.title");
            System.out.println(" Title Of site : "+title);

            String domain = (String)jse.executeScript("return document.domain");
            System.out.println("Web Site Domain-Name : "+domain);

            // To get all NodeList[1052] document.querySelectorAll('*');  or document.all
            jse.executeAsyncScript("document.getElementsByTagName('*')");

            String error=(String) jse.executeScript("return window.jsErrors");
            System.out.println("Windowerrors  :   "+error);



            System.out.println("To Find the input tag position from top"); 
            ArrayList<?> al =  (ArrayList<?>) jse.executeScript(
                    "var source = [];"+
                    "var inputs = document.getElementsByTagName('input');"+
                    "for(var i = 0; i < inputs.length; i++) { " +
                       "   source[i] = inputs[i].offsetParent.offsetTop" +      //"    inputs[i].type = 'radio';"
                    "}"+
                    "return source"                 
                    );//inputs[i].offsetParent.offsetTop     inputs[i].type

            System.out.println("next");
            System.out.println("array : "+al);

            // (CTRL + a) to access keyboard keys. org.openqa.Selenium.Keys 
            Keys k = null;
            String selectAll = Keys.chord(Keys.CONTROL, "a");
            WebElement body = driver.findElement(By.tagName("body"));
            body.sendKeys(selectAll);

            // Search for text in Site. Gets all ViewSource content and checks their.
            if (driver.getPageSource().contains("login")) {
                System.out.println("Text present in Web Site");
            }

        Long clent_height = (Long) jse.executeScript("return document.body.clientHeight");
        System.out.println("Client Body Height : "+clent_height);

        // using Selenium we con only execute script but not JS-functions.

    }
    driver.quit(); // to close browser
}

Pour exécuter des fonctions utilisateur, écrire JS dans un fichier, le lire en tant que chaîne et l'exécuter pour l'utiliser facilement.

Scanner sc = new Scanner(new FileInputStream(new File("JsFile.txt")));
        String js_TxtFile = ""; 
            while (sc.hasNext()) {          
                String[] s = sc.next().split("\r\n");   
                for (int i = 0; i < s.length; i++) {
                    js_TxtFile += s[i];
                    js_TxtFile += " ";
                }           
            }
        String title =  (String) jse.executeScript(js_TxtFile);
        System.out.println("Title  : "+title);

document.title & document.getElementById () est une propriété/méthode disponible dans les navigateurs.

JsFile.txt

var title = getTitle();
return title;

function getTitle() {
    return document.title;
}
4
Yash

Je ne voyais pas comment ajouter des paramètres à l'appel de méthode, il m'a fallu un certain temps pour le trouver, donc je l'ajoute ici . Comment passer des paramètres (à la fonction javascript), utilisez "arguments [0] "en tant que paramètre place, puis définit le paramètre en tant que paramètre d’entrée dans la fonction executeScript.

    driver.executeScript("function(arguments[0]);","parameter to send in");
1
David Marciel

Vous pouvez également essayer de cliquer avec JavaScript:

WebElement button = driver.findElement(By.id("someid"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].click();", button);

Aussi, vous pouvez utiliser jQuery. Dans le pire des cas, pour les pages rebelles, il peut être nécessaire d’effectuer des clics avec une application EXE personnalisée. Mais essayez d'abord les solutions évidentes.

1
Lukasz

Si vous voulez lire le texte de n'importe quel élément en utilisant JavaScript, vous pouvez faire quelque chose comme le code suivant:

WebElement ele = driver.findElement(By.xpath("//div[@class='infaCompositeViewTitle']"));
String assets = (String) js.executeScript("return arguments[0].getElementsByTagName('span')[1].textContent;", ele);

Dans cet exemple, j'ai le fragment HTML suivant et je lis "156".

<div class="infaCompositeViewTitle">
   <span>All Assets</span>
   <span>156</span>
</div>
0
muhdchoaib