Selenium:如何在我的测试中注入Javascript变量?

时间:2011-08-24 13:55:12

标签: selenium

我正在使用Selenium客户端驱动程序2.4.0。使用WebDriverBackedSelenium对象运行测试时,例如

     final FirefoxDriver driver = new FirefoxDriver();
     selenium = new WebDriverBackedSelenium(driver, baseUrl); 

如何将Javascript数组注入我的测试中,以便在不同的页面中保留范围?也就是说,我想创建一个JS var“myArray”,当我打开“http://mydomain.com/page1.html”时我可以访问它(使用selenium.getEval),但是当我打开另一个页面时我可以参考(“http://mydomain.com/page2.html”)在同一个Selenium测试中。

谢谢, - 戴夫

2 个答案:

答案 0 :(得分:1)

我认为不可能开箱即用。

变通方法应该工作 - 向页面添加一些可以从JSON反序列化的库(例如Dojo),使用它将数组定义加载到某个JavaScript变量,然后在离开页面之前将其恢复,将其存储在范围请求之外。 / p>

但我必须说你有一种奇怪的要求 - 试图做什么?

答案 1 :(得分:1)

你可以通过施法来做到这一点。执行JavaScript以返回数组。 JS数组必须只包含一个类型,它必须是原始类型。

例如,执行一个返回字符串数组的脚本:

ArrayList<String> strings = (ArrayList<String>) js.executeScript(returnArrayOfStrings);

如果您需要任何其他类型的数组,可以从这些字符串构建它。例如,如果您需要一个WebElements数组,请设计JS以返回定位器,然后迭代,查找元素并构建新数组:

    ArrayList<String> xpaths = (ArrayList<String>) js.executeScript(getLocators);
    ArrayList<WebElement> elements = new ArrayList<WebElement>();
    for (String xpath: xpaths){
         element = driver.findElement(By.xpath(xpath));
         elements.add(element);
    }

Java中有Array,因此当您的测试转到不同的页面并且仍然引用Java Array时,您可以将其保留在内存中,

唯一的问题是,如果您的JS数组在客户端更改,您的Java Array将不会自动更新(jsexecuter每次执行只返回一次),但这不是重要的是 - 您可以通过getter访问它,而不是直接引用Java Array,getter首先执行JS以获取新的Array,您可以使用它来替换前一个,或者合并在将新/更新的数组返回到测试代码之前,等等。