日期:2014-05-16  浏览次数:20345 次

动态执行JavaScript代码的注意点

Selenium 与EXT

?

n? EXT使用JS动态生成Html和CSS代码。

n? 如果未给EXT元素指定id,会使用自增id。无法确定id的值。

n? 如果EXT的界面元素发生变化,id也会发生变化。

n? Selenium录制工具因此无法定位EXT生成的Web界面

根本原因就是Selenium需要定位html元素,而Ext的很多html元素都是Ext生成的。而且生成的元素的Id都是Ext自动创建的。

解决方法:

n? Ext为每一个组件分配ID

n? 但是有一些Html元素无法指定ID

n? Selenium录制工具辅助手工编写测试代码

n? Selenium可以使用JS代码,操作用户界面的EXT对象。

可以使用Selenium接口的getEval方法在浏览器中执行JS代码。

Selenium接口

java.lang.String getEval
(java.lang.String?script)

方法,动态执行JavaScript代码。

storeeval_r( script, variableName )

Arguments:

·???????? script - the JavaScript snippet to run

·???????? variableName - the name of a variable in which the result is to be stored.

Returns:

the results of evaluating the snippet

结果存储在JS的变量名中。

动态执行JavaScript 代码的注意点

???????? 通过调用Selenium接口的geteval_r()等方法可以直接把Java中的JavaScrip代码发送到浏览器中执行。

???????? 但是,这里实际上执行的并不是标准的JavaScript的eval_r()方法。geteval_r()方法中的JavasScript代码的this是JavaScript中的Selenium对象,而不是window对象。

???????? 如果你需要调用当前页面的window对象的方法,你需要直接指出window对象,如:“window.document.getElementByIdx('foo');”。

??????? geteval_r()方法中的JavasScript代码的this是JavaScript中的Selenium对象。请注意这不是Java中的 Selenium接口,而是JavaScript中的Selenium对象。JavaScript中的Selenium对象的作用是代表Java中的 Selenium接口执行一系列的命令,让浏览器执行。

???????? 另外,Selenium接口的selectFrame和selectWindow方法可以修改当前Selenium命令的目标窗口。也就是说,当前的window对象会改变。

Selenium 执行Ext的例子:

protected Selenium browser;

……

this .browser.geteval_r("window.frames['1000'].window.Ext.getCmp('testId-09').setValue('应严办!');");

?

说明:

??? Window是当前Selenium命令的目标窗口,这个当前窗口可以通过Selenium接口的selectFrame和selectWindow方法修改!

?

?

Selenium 动态执行JavaScript的例子:

也可以使用这种方法,在Java端注入javascript代码到页面中动态执行,如:

rowNumStr = this .browser

????????????? .geteval_r("(function(){"

???????????????????? + "var tableLength=0;"

???????????????????? + " var tables=window.frames['iframe_00300000000000000003'].window.document.getElementsByTagName_r('table'); "

???????????????????? + "for(var j=0;j<tables.length;j++){"

????????????????? ??? + "? if(tables[j].className=='x-grid3-row-table'){"

???????????????????? + "???? tableLength++;"

???????????????????? + "??? if(tables[j].childNodes[0].childNodes[0].childNodes[1].childNodes[0].innerText=='"

???????????????????? + complainIdValue + "' ) {"

???????????????????? + "?????? return tableLength;" + "?? ??}" + "?? }"

???????????????????? + "}" + "return -1;" + "})();");