• Selenium JavascriptExecutor 详解


    Selenium JavascriptExecutor 详解

        介绍

            在Selenium IDE中我们可以使用runScript命令去执行js代码片段,以辅助完成一些Selenium不方便达成的任务,同样,在WebDriver中我们也可以使用JavascriptExecutor工具类去完成js代码执行,下面我就四点详细阐述该工具的使用及工作原理。

            

        本篇文章讨论主题包括:

            1. JavascriptExecutor执行js代码的两种方法介绍。

            2. JavascriptExecutor执行js代码的两种方法使用示例。

            3. JavascriptExecutor执行js的原理。

            4. JavascriptExecutor常用案例。

        下面我们依次对以上三个话题进行详细讲解!

        

        1. JavascriptExecutor执行js代码的两种方法介绍

            Object executeScript(String script, Object... args);

            Object executeAsyncScript(String script, Object... args);

            

            executeScript方法接收两个参数和一个返回值:

            script,javascript代码片段,这段js代码片段是作为js函数的完整方法体,可以使用return语句作为函数的返回值。

            args, 参数数组,参数数组用于将外部数据传递给script(js代码片段),script中可以通过arguments[index]方式索引args数组中的参数;参数数据类型必须是以下几种(number, boolean, String, WebElement, 或者以上数据类型的List集合),当然无参数可以保留为空。

            返回值,返回值是由js代码片段计算后通过return语句返回,返回值数据类型可以为(WebElement,Double,Long,Boolean,String,List或Map),没有return语句,这里返回数据为null。

            

            executeAsyncScript方法接收两个参数和一个返回值:

            script,javascript代码片段,这段js代码片段是作为js函数的完整方法体,与executeScript主要有两点不同:

                1. 此处的script必须在代码结束时明确调用callback方法以通知webdriver该script执行结束;该callback方法是由webdriver注入到arguments数组中最后一个元素;可以通过arguments[arguments.length-1]获取到,且可以使用该回调函数返回计算结果(只需要将放回结果作为回调函数的参数即可)

                2. 该script执行会有超时时间,默认为60s,超时时间内未调用callback方法,JavascriptExecutor会抛出Timeout异常。

            args, 规则同executeScript。

            返回值,规则同executeScript

        2. JavascriptExecutor执行js代码的两种方法使用示例。

    		//示例一    使用executeScript方法,在js代码中获取方法传入的参数数组
    		//使用arguments索引方法中传入的参数数组,并使用return将定义的函数体计算结果返回.
    		//代码中传入3个参数,js语句中索引第二,三各参数。
    		
    		JavascriptExecutor jsExec = (JavascriptExecutor)driver;
    		String functionBody = "return arguments[1]+','+arguments[2]";
    		String returnRes = (String)jsExec.executeScript(functionBody, 1, "hello", "selenium");
    		System.out.println(returnRes);
    		
    		
    		//示例二    使用executeAsyncScript方法,在js代码中获取方法传入的参数数组,并通过调用callback方法返回函数体计算结果
    		//代码中传入3个参数,js语句中索引第二,三各参数。
    		
    		//超时时间是为callback方法调用而设置的,超时时间内没有调用callback方法,默认会再等待设定的超时间,在此没有返回则抛出异常。
    	        driver.manage().timeouts().setScriptTimeout(2, TimeUnit.SECONDS);
    		
    		String script = "var res = arguments[0] + ',' + arguments[1]; "
    				+ "var callback = arguments[2];"
    				+ "callback()";
    		String returnVal = (String)driver.executeAsyncScript(script, "hello" , "selenium");
    		System.out.println(">>>" + returnVal);
     

            3. JavascriptExecutor执行js的原理。

            如何理解JavascriptExecutor如何运行js代码,需要对javascript基础有一定的认识,首先给大家罗列两个javascript中三种定义和调用函数的示例,大家看完示例就不难理解webdriver是如何去运行javascript代码了,同时也能消除(为何在javascript中使用arguments来接收方法传入的参数)的困惑。

        第一种函数定义方式:
        function sum(a, b) {
            return a+b;
        }
        sum(2,3);  //输出5
        
        第二种函数定义方式:
        
        var sum = new Function('a', 'b', 'return a+b;');
        sum(2,3)  //输出5
        
        第二种方式我们可以改写为: 
        
        new Function('a', 'b', 'return arguments[0]+arguments[1]').apply(null,[1,2]);  //输出5
     

            当然函数的定义不限于以上三种写法,我们这里重点讲解第二种和第三种方法,相信大家在看到这两种使用方式时,已经理解webdriver是如何调用js代码了,但还会疑惑为什么会使用arguments来接收参数。

            我们所有定义的function实质上是对Function类的实现,而Functions类的定义中arguments作为局部变量,通过arguments索引接收所有参数,即使在方法定义中未指定的参数,大家来看下面的代码示例:

        function add(a) {
            var sum =0,
            len = arguments.length;
            for(var i=0; i<len; i++){
                sum += arguments[i];
            }
            return sum;
        }
        
        add(1,2,3,4);   //10
     

            

            相信讲到这里大家应该非常清楚webdriver是如何去执行js代码的原理了,事实上webdriver就是通过new Function方式定义匿名函数来运行javascript代码的。

  • 相关阅读:
    JDBC连接数据库
    Promise的基本用法
    Cookie、LocalStorage 与 SessionStorage的区别在哪里?
    判断时间大小,数值大小
    控制input文本框只能输入正整数
    利用layer弹框代替alert效果,且可以增加callback函数
    input 只能输入数字且控制位数
    递归函数
    分页插件,直接把返回值赋过去即可
    获取选中checkbox的value值
  • 原文地址:https://www.cnblogs.com/lnn123/p/10209641.html
Copyright © 2020-2023  润新知