Selenium的JavascriptExecutor在JMeter中的JSR223采样器中不起作用

时间:2018-04-02 13:23:30

标签: javascript selenium jmeter performance-testing blazemeter

我想实时衡量网页的效果。因此,获得了Jlenter与Selenium的第一个选项。

我能够使用Java中的JSR223采样器进行一些导航和点击操作。

但是,在等待所有JQuery和DOM就绪状态时,我无法在Javascript Executor(org.openqa.selenium.JavascriptExecutor)中执行。下面是我的Wait语句代码。

setStrictJava(false); 
/*
---some block of code---
*/
while(true){ 
     Boolean isAjaxCompletes = (Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0;"); 
     Boolean isJsLoaded = ((JavascriptExecutor)driver).executeScript("return document.readyState;").toString().equals("complete"); 
     if(isAjaxCompletes && isJsLoaded){ 
           break; 
     } 
}

我收到以下错误:

2018-04-02 18:39:33,794 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: Sourced file: inline evaluation of: ``import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; impor . . . '' : Error in method invocation: Static method executeScript( java.lang.String ) not found in class'org.openqa.selenium.JavascriptExecutor' : at Line: 36 :  
 in file: inline evaluation of: ``import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; impor . . . '' : JavascriptExecutor .executeScript ( "return jQuery.active == 0;" ) 
in inline evaluation of: ``import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; impor . . . '' at line number 36
javax.script.ScriptException: Sourced file: inline evaluation of: ``import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; impor . . . '' : Error in method invocation: Static method executeScript( java.lang.String ) not found in class'org.openqa.selenium.JavascriptExecutor' : at Line: 36 : in file: inline evaluation of: ``import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; impor . . . '' : JavascriptExecutor .executeScript ( "return jQuery.active == 0;" ) 
in inline evaluation of: ``import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; impor . . . '' at line number 36
at bsh.engine.BshScriptEngine.evalSource(BshScriptEngine.java:93) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19]
at bsh.engine.BshScriptEngine.eval(BshScriptEngine.java:46) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19]
at javax.script.AbstractScriptEngine.eval(Unknown Source) ~[?:1.8.0_151]
at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:223) ~[ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:69) [ApacheJMeter_java.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:490) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:416) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:250) [ApacheJMeter_core.jar:4.0 r1823414]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]

请帮我解决这个问题。

JMeter版本:4.0
插件自动下载selenium版本:2.52.0
Java:1.8,更新151

3 个答案:

答案 0 :(得分:1)

您正在使用静态引用调用方法,该方法不存在。您应该创建JavascriptExecutor对象并调用executeScript方法:

JavascriptExecutor js = (JavascriptExecutor) driver;  
Boolean isJsLoaded = js.executeScript("return document.readyState;").toString().equals("complete"); 

答案 1 :(得分:0)

您需要使用equals()方法,如下所示:

import org.openqa.selenium.JavascriptExecutor;

Boolean isAjaxCompletes = (Boolean) ((JavascriptExecutor) webdriver).executeScript("return jQuery.active").equals("0")); 
Boolean isJsLoaded = ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"));

答案 2 :(得分:0)

  1. 首先切换为Groovy语言,since JMeter 3.1 it is recommended to use Groovy for any form of scripting
  2. 其次,您可以在WebDriver Sampler中使用普通ExplicitWait,如下所示:

    import org.openqa.selenium.WebDriver
    import org.openqa.selenium.support.ui.ExpectedCondition
    import org.openqa.selenium.support.ui.WebDriverWait
    
    WDS.sampleResult.sampleStart()
    WDS.browser.get('http://jmeter-plugins.org')
    WebDriverWait wait = new WebDriverWait(WDS.browser, 5)
    
    ExpectedCondition<Boolean> documentReady = new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(WebDriver driver) {
            return WDS.browser.executeScript("return document.readyState")
                    .toString().equalsIgnoreCase("COMPLETE");
        }
    };
    wait.until(documentReady)
    WDS.sampleResult.sampleEnd()