经伟

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在用selenium webdriver 编写web页面的自动化测试代码时,有时对页面对象的操作需要通过js语句去执行,selenium本身就支持执行js,我们在代码中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScriptexecuteAsyncScript这两个方法了,其中executeScript是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕;executeAsyncScript方法是异步方法,它不会阻塞主线程执行。

executeScript方法如果有返回值,有以下几种情况:

    • 如果返回一个页面元素(document element), 这个方法就会返回一个WebElement
    • 如果返回浮点数字,这个方法就返回一个double类型的数字
    • 返回非浮点数字,方法返回Long类型数字
    • 返回boolean类型,方法返回Boolean类型
    • 如果返回一个数组,方法会返回一个List<Object>
    • 其他情况,返回一个字符串
    • 如果没有返回值,此方法就会返回null
从javaScript代码中返回数据,我们需要使用return关键字。基于返回值的类型,我们需要对executeScript() 方法进行转型。对于带小数点的值,使用Double类型,非小数值可以使用Long类型,布尔值可以使用Boolean类型,如果返回的是HTML节点, 可以使用 WebElement类型,文本值,可以使用String类型。如果返回的是对象列表,基于对象类型的任何值都可以。

为了验证写的js代码是否正确,需要首先对其验证,然后加入到脚本里去执行。firebug的console模块就提供了这样的一个调试功能,打开firebug,切换到console页面,在右边就可以输入js脚本,点击run就可以调试了。
例子:
1,打开baidu,
2,随便输入搜索内容
3,用firebug识别到“百度一下‘按钮
4,在右边输入js代码,document.getElementById("su").click();
  或var s=document.getElementById('load');
  s.click()
5,点击run,你会发现js脚本触发了”百度一下“按钮,进行搜索动作。
 

 在webdriver脚本中的使用形式:

WebDriver driver = new FirefoxDriver(); 

JavascriptExecutor jse = (JavascriptExecutor)driver; 

1. 直接操作元素

jse.executeScript("window.document.getElementById('jingshou').click()");
 
2、传入element当着参数然后操作

WebElement element = driver.findElement(By.id("jingshou"));  

jse.executeScript("arguments[0].click();", element);  也可以写成这样jse.executeScript("arguments[0].onclick=function(){alert('This is my alert!');}", element) 

你也可以传入多个参数,使用arguments[]下标来指定你要使用的参数,记住下标是从0开始的

 
代码展示:
WebDriver driver = new FirefoxDriver();
        try
        {
            driver.get("http://www.baidu.com");
            //利用webdriver键入搜索关键字
            //driver.findElement(By.id("kw")).sendKeys("yeetrack");
            //利用js代码键入搜索关键字
            ((JavascriptExecutor)driver).executeScript("document.getElementById(\"kw\").value=\"yeetrack\"");
            //利用js代码取出关键字
            String keyword = (String) ((JavascriptExecutor)driver).executeScript("var input = document.getElementById(\"kw\").value;return input");
            System.out.println(keyword);
            driver.findElement(By.id("su")).click();
            TimeUnit.SECONDS.sleep(5);
         }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            driver.quit();
        }

 


但是目前好像不支持document.getElementByXpath()方法去操作对象。或许是没有研究透,需要更深入的了解。下期文章再更新。
posted on 2015-08-10 12:18  经伟  阅读(7816)  评论(1编辑  收藏  举报