您的位置:首页 > Web前端 > JavaScript

JS注入操作页面对象

2015-08-10 12:18 791 查看
在用selenium webdriver 编写web页面的自动化测试代码时,有时对页面对象的操作需要通过js语句去执行,selenium本身就支持执行js,我们在代码中
import org.openqa.selenium.JavascriptExecutor;
就可以使用
executeScript
executeAsyncScript
这两个方法了,其中
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();

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()方法去操作对象。或许是没有研究透,需要更深入的了解。下期文章再更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: