javascript - 有没有办法在开始执行 javascript 之前转换由 HtmlUnit 加载的页面?

标签 javascript java selenium testing htmlunit

首先我想描述一下我提出这个问题的动机。

我有一个复杂的网页要使用 Selenium + HtmlUnit 进行测试,它会启动各种 javascript 脚本。我描述的问题应该很常见。

在页面上有一个按钮,jQuery 在页面加载后将点击回调(点击事件处理程序)绑定(bind)到该按钮。在测试代​​码中有一个明确的 Wait(这是一个 Selenium 术语)按钮可以点击。因此,一旦按钮变得可点击,Selenium 就会点击它。然而,这通常发生在 jQuery 设法将单击事件处理程序附加到按钮之前。在这种情况下,Selenium 测试失败。

我想做的是在javascript开始在页面上执行之前预处理HtmlUnit访问的网页,注入(inject)一些<script>myownscript()</script>在页面的开头(以便它在该页面上的任何其他脚本之前执行)。然后我将能够知道,控制 Selenium 测试代码中的某些条件,点击事件处理程序的准确附加发生的时间(我具体如何执行此操作取决于应用程序的详细信息)。如果我让 Selenium 单击按钮,那么将保证单击事件处理程序的存在,并且测试将按计划进一步进行 - 不会因缺少单击事件处理程序而导致错误。

让我们撇开这个想法是好是坏的问题(当然,更简单的方法是在尝试单击有问题的按钮之前在 Selenium 测试代码中引入足够大的延迟,但是那么测试的整体持续时间可能会有问题,因为我描述的问题存在于被测应用程序的许多页面上)。 Selenium/HtmlUnit 中是否有一些钩子(Hook)允许预处理从服务器获取的页面,在 javascript 开始在页面上执行之前注入(inject)我描述的脚本?

最佳答案

在这种情况下,您可以使用 JavaScriptExecutor。您可以在 String 脚本 中添加一个函数来执行您想要的任何操作。

WebElement button = driver.findElement(By.id("my-button"));
JavascriptExecutor jsExe = ((JavascriptExecutor) driver);
String script = "console.log(arguments[0].id); return arguments[0].id";
Object oj = jsExe.executeScript(script, button);
String txt = oj.toString();
System.out.println(txt);

如果要使用aycn如setTimeout()请注意,它会立即返回。请参阅我的回答中的异步方法示例:method execute_script don't wait end of script to return value with selenium in python

关于javascript - 有没有办法在开始执行 javascript 之前转换由 HtmlUnit 加载的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925414/

相关文章:

javascript - 如何公开嵌入式 Flash 对象的 JavaScript 接口(interface)?

php - 使用 jquery 动态内部文本的数字总和

javascript - 以 this 作为参数的复选框开关不会保存更改 .checked 值

java.lang.异常 : No Certificate file specified or invalid file format

java - Jenkins 将参数传递给 testNG Java

javascript - 如何在 Rails 中使用普通文本区域切换 CKEditor?

java - 在 java 中打印多维数组的最佳方法是什么?

java - 如何安装 TestFX?

python-3.x - 如何通过 Selenium 在 Chrome 浏览器中使用 Tor

c# - 使用 Selenium Web Driver 注入(inject)自定义 JS 代码