Selenium WebDriver:我可以在多大程度上依赖 JavaScript?

Posted

技术标签:

【中文标题】Selenium WebDriver:我可以在多大程度上依赖 JavaScript?【英文标题】:Selenium WebDriver: To which extent can I rely on JavaScript? 【发布时间】:2013-10-22 09:11:59 【问题描述】:

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

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

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

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

在 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 注入浏览器。这将包含fooJavaScript 实现,例如fooJavaScript。在下一次executeScript 调用中,将调用此fooJavaScript

虽然这种方法可以让我不必执行 3 次自定义命令(Java、Python、Selenium IDE),但我有一些顾虑:

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

非常感谢您在这方面的真实经历。

【问题讨论】:

来自我的“真实经历”。我很少在测试时甚至需要使用 javascript。在我看来,如果您需要触发一些 JavaScript 事件,那么这是糟糕的应用程序设计。从 UI 中抽象出来通常只是糟糕的设计。我的意思是,这就是您正在测试的内容,不是吗? 【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

以上是关于Selenium WebDriver:我可以在多大程度上依赖 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

自动化测试-webdriver(JAVA) Selenium IDE 用法

在使用设计模式时,您可以在多大程度上防止修改现有代码?

PostgreSQL 在多大程度上支持并行 DDL?

给出 SIGTERM 后,在多大程度上可以依赖写入磁盘?

您可以在多大程度上自定义 Fabric 的 Digits 在 Android 上的流程、外观和感觉?

ui自动化之selenium操作简单元素操作--续