如何在 Eclipse 中使用 Selenium 将外部 .js 导入到我的 Java 测试中?

Posted

技术标签:

【中文标题】如何在 Eclipse 中使用 Selenium 将外部 .js 导入到我的 Java 测试中?【英文标题】:How can I import an external .js to my Java test with Selenium in Eclipse? 【发布时间】:2015-07-26 17:08:18 【问题描述】:

我想在 Eclipse 中将我的 javascript 函数导入我的 Java 项目并与 Selenium 一起使用,但我找不到执行此操作的表单。

我尝试将这样的 .js 文件制作成 Selenium 可以识别此代码:

Selenium.prototype.doProve = function() 
    $("#proveDiv > div > div").each(function(i, obj)
     
    $(i).click(function());
    );
;

好吧,你可以看到我有 3 个 div,我想做的是访问我有 2 个 div 的第三个 div(这是循环的线索)。在循环的每个 div 中,我想点击一下。

我尝试在我的 Java 项目中使用此函数,但无法获得任何结果,因此我尝试将此函数作为字符串执行,然后像这样执行脚本:

String script = "$(\"#proveDiv > div > div" +
                    "\").each(function(i, obj) " +
                    "$(i).click(function());)";

//Executing script

 if (driver instanceof JavascriptExecutor) 
        ((JavascriptExecutor) driver).executeScript(script);
 

它可以工作,但不是很有用,因为我想制作一个包含所有 JavaScript 函数的外部 .js 并从那里调用它们,而不是在字符串中。

任何帮助将不胜感激。我在这里看到了一些问题,但其中任何一个都对我有用。 非常感谢!

【问题讨论】:

【参考方案1】:

它可以工作,但它不是很有用,因为我想制作一个外部 .js 包含所有 JavaScript 函数并从中调用它们 在那里,而不是在字符串中。

您只能通过将外部 js 文件加载到 DOM 中来实现此目的

var addscript=window.document.createElement('script');addscript.type='text/javascript';addscript.src='http://localhost/somescript.js';document.getElementsByTagName('body')[0].appendChild(addscript);

注意:大多数浏览器不允许你加载本地资源,所以将你的外部 js 文件放在本地网络服务器中,然后像 http://localhost/somescript.js 一样访问它

将 js 文件加载到 DOM 后,现在可以调用外部 js 文件中的 javascript 函数

示例

假设我们有一个名为 somescript.js 的外部 js 文件,其中包含以下函数

//simple function which sets the value "test" to the search box

window.somefunc = function () document.getElementsByName("s")[0].value='test';

Webdriver 代码

     driver.get("http://www.jquery.com");

     //Load the External js file into DOM

     ((JavascriptExecutor) driver)
      .executeScript("var addscript=window.document.createElement('script');addscript.type='text/javascript';addscript.src='http://localhost/somescript.js';document.getElementsByTagName('body')[0].appendChild(addscript);");

     //wait for the js to be loaded to the DOM

     ((JavascriptExecutor) driver)
      .executeScript("return typeof(somefunc)").toString().equals("function");


     //Now you call the JavaScript functions in the JS file

     ((JavascriptExecutor) driver)
      .executeScript("somefunc();");

注意:在幕后 Selenium 将您的 JavaScript 代码包装在 anonymous function 中。所以你的 somefunc 函数是这个匿名函数的本地函数。由于 JavaScript 的作用域规则, somefunc 在那个匿名函数之外不存在。所以我们通过将其分配给 window 使其成为全局函数。

编辑

而且我真的不明白你为什么使用 window 语句。和我 正在搜索类似 ((JavascriptExecutor) driver).executeScript("这里是 .js");但不知道是不是 可能

这就是executeScript 方法执行提供的javascript的方式

提供的脚本片段将作为 匿名函数。

如果我们使用下面的代码示例

((JavascriptExecutor) driver)
      .executeScript("somefunc = function () document.getElementsByName("s")[0].value='test';");

((JavascriptExecutor) driver)
      .executeScript("somefunc();");

(function() 
        somefunc = function () document.getElementsByName("s")[0].value='test';
    )();

    (function() 
        somefunc();
    );

你说你想把外部.js放在哪里是什么意思 进入 DOM?

DOM 是指构建为对象树的页面的文档对象模型(简称您的网页)。我们使用 javascript 将外部 js 加载到网页,然后调用 js 文件中的函数并执行它们(就像上面的例子一样)。

在您编辑的代码中。两个功能一样吗?

我只是举了一个例子,我的意思是执行脚本中提供的每个脚本都将在匿名函数的主体中执行。在我们的例子中,我们没有使用 executescript 来创建 somefunc 函数,而是从dom 中的外部 js 文件,我们只使用 executescript 方法调用它,因此您可以使用或不使用 window 对象来调用它

  //simple function which sets the value "test" to the search box

somefunc = function () document.getElementsByName("s")[0].value='test';//this will also work

希望这对您有所帮助。如果您有任何疑问,请回复。

【讨论】:

也许这个问题有点傻,但我对 javascript 和 selenium 完全陌生。您说要将外部 .js 放入 DOM 是什么意思?而且我真的不明白你为什么使用 window 语句。我正在搜索类似((JavascriptExecutor) driver).executeScript("here the .js"); 的东西,但我不知道这是否可能。 这就是我将 .js 文件创建为 Selenium.prototype.doProve... 的原因。因为我在网上看到必须要准备到Selenium才能看懂这里doProve是函数名。 @Error404 我已经编辑了我上面的回复。如果您有任何进一步的疑问,请检查并回复 在您编辑的代码中。两个功能一样吗? 我当然会做,但现在我没有这个项目,所以我无法证明它。这就是为什么我给你赏金而不接受答案的原因。因为我认为您的回答非常有帮助,但我想在接受答案之前证明它。当我有一个可以证明的新项目时,我会标记为已接受。不要怀疑它。快乐编码 ;)【参考方案2】:

您可以将 javascript 存储在属性或 xml 文件等文件中。

示例文件:

clickOnLoginButton=function bclick()....;bclick();

示例代码:

FileInputStream file;
Properties properties = new Properties();

// load the file handle for properties file
file = new FileInputStream(filename);

// load all the properties from this file
properties.load(file);

// we have loaded the properties, so close the file handle
file.close();

String mainExecutor = properties.getProperty(parameter);
WebDriver dr = initalizeWebDriver();
JavascriptExecutor js = (JavascriptExecutor) dr;

js.executeScript(mainExecutor);

【讨论】:

以上是关于如何在 Eclipse 中使用 Selenium 将外部 .js 导入到我的 Java 测试中?的主要内容,如果未能解决你的问题,请参考以下文章

如何搭建selenium+java环境搭建

Selenium + Firefox到Selenium + PhantomJS [关闭]

Selenium:我正在使用 Firefox 版本 46.01 并在 eclipse 中测试显示错误消息

如何在 Java 中执行 Selenium 测试

如何在 Selenium webDriver 中使用 Javascript 获取 textBox 的值? [复制]

硒包“ com.thoughtworks”在Eclipse中无法解析