2016-03-10 14 views
2

首先我想描述我的问题的动机。在开始执行javascript之前,有没有办法转换HtmlUnit加载的页面?

我有一个复杂的网页来测试硒+ HtmlUnit,它启动不同的JavaScript脚本。我描述的问题应该是相当普遍的。

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

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

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

+0

我还不清楚你的目的是什么。正如你所提到的,你应该添加等待元素。添加Wait很容易。 – Buaban

+0

@Buaban我试图编辑问题以使其更清晰。 –

回答

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

+0

您确定以这种方式执行的脚本会在嵌入页面的任何其他JavaScript代码之前执行**吗?在我看来,没有。 –

+0

不,它不会在应用程序中的JS之前执行。但是,您可以使用它在应用程序上添加和执行JavaScript。所以你可以添加方法来验证按钮的状态或控制任何对象。 – Buaban

+0

谢谢,我意识到这种可能性(轮询直到点击事件处理程序变得可用),但是这个轮询是我希望通过在页面上运行任何其他javascript之前注入并执行javascript来避免的。这个想法是,这个注入的javascript在点击事件处理程序绑定到按钮后在页面上添加了另一个元素,并且在测试代码中,我等待直到这个新元素变为可用,并显式等待。不需要轮询。 –

相关问题