5

我正在开发一个使用一些自定义命令扩展 Selenium 2 的库。该库应该可以从 Selenium 的 Java 和 Python 绑定以及 Selenium IDE 中使用。根据我的研究,这三个目标绑定至少应涵盖所有 Selenium 2 脚本的 80%。

为了实现我对 Selenium IDE 的自定义命令,我想我需要用 JavaScript 为它编写一个插件。

我的问题是:如果我已经在 J​​avaScript 中实现了我的自定义命令,那么将这个实现重新用于我的库的 Java 和 Python 绑定是否安全?

我正在考虑一种方法,通过WebDriver#executeScript. 这是我正在考虑的伪代码实现。

在 Java 中:

public void fooJava() {
    executeScript("Inject code.js");
    executeScript("fooJavaScript();");
}

code.js

function fooJavaScript() {
    // Implementation of command "foo" from Selenium IDE plugin.
}

因此,要在 Java 中执行我的自定义命令fooJava(),我的库code.js将通过executeScript. 这将包含一个JavaScript实现foo,比如说fooJavaScript。在下一次executeScript调用中,这fooJavaScript将被调用。

虽然这种方法会使我不必执行三次自定义命令(Java、Python、Selenium IDE),但我有一些担忧:

  1. 当我注入我的code.js,我是否有破坏网站全局状态的危险?
  2. 我可以在多大程度上依赖 JavaScript?如果出现警告对话框,它会起作用吗?在实践中,有多少与 Selenium 一起使用的驱动程序支持 JavaScript?例如。HtmlUnit?
  3. 这是否适用于所有主要浏览器(IE、Chrome、Firefox、Safari 的最新版本)?

您在这方面的真实经历将不胜感激。

4

1 回答 1

1

原则指出,如果您只是使用 WebDriver 交付有效负载,则不应使用 JS 作为测试机制。

WebDriver = 集成测试
JS = 如果你想要单元测试

我不完全了解您的用例,但是:

如果您尝试运行集成测试,请坚持使用 WebDriver 以最好地模拟用户交互。您还可以通过依赖 WebDriver 挂钩与页面交互来避免将来出现跨浏览器 JS 问题,例如,最好依靠社区为每个浏览器提供可靠的基本 DOM 交互 API。如果您无法通过浏览器交互触发测试条件,那么您将进入单元/代码测试领域,而不是集成测试。

如果您尝试运行 JS 本质上是为了测试单个功能或一段代码而不是集成交互,那么您正在尝试运行单元测试。单元测试最好在 JS 中使用 Jasmine(在此处命名任何框架)之类的东西完成。

推理:
集成测试应该尽可能独立于实现。您不需要知道函数名称来触发集成测试,因为将来有人可能会更改函数名称或重构代码。
由于您正在担任 QE/测试员角色,因此您不希望在代码更改时负责破坏集成测试 - 如果您使用它并且负责,那么每次代码重组时您都需要更改测试。

资料来源:在 10,000 多名员工软件公司担任 QE 的经验。

于 2013-10-22T22:28:29.407 回答