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

时间:2016-03-10 19:23:41

标签: javascript java selenium testing htmlunit

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

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

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

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

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

1 个答案:

答案 0 :(得分: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);

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