【问题标题】:Is there a way to transform a page loaded by HtmlUnit before it starts executing javascript?有没有办法在开始执行 javascript 之前转换 HtmlUnit 加载的页面?
【发布时间】:2016-06-25 19:46:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我仍然不清楚你的目的是什么。正如您所提到的,您应该添加 Wait for 元素。添加等待很容易。
  • @Buaban 我试图编辑问题以使其更清晰。

标签: javascript java selenium testing htmlunit


【解决方案1】:

在这种情况下,您可以使用 JavaScriptExecutor。你可以在String script 中添加一个函数来做任何你想做的事情。

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代码之前执行吗?在我看来不是。
  • 不,它不会在你的应用程序中的 JS 之前执行。但是,您可以使用它在您的应用程序上添加和执行 JavaScript。因此,您可以添加方法来验证按钮的状态或控制任何对象。
  • 谢谢,我知道这种可能性(轮询直到单击事件处理程序可用),但是我希望通过在页面上运行任何其他 javascript 之前注入和执行 javascript 来避免这种轮询.这个想法是这个注入的javascript在点击事件处理程序绑定到按钮后在页面上添加另一个元素,并且在测试代码中我等待这个新元素通过显式等待变得可用。无需投票。
  • 看来您需要创建一个 Chrome 扩展程序。扩展必须完成这些任务并提供一种方法来获取每个对象的状态。您必须在创建 webdriver 时添加此扩展。我想给你看一个例子,但我完全忘了怎么做 T-T。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多