【问题标题】:Running Selenium scripts with JMeter使用 JMeter 运行 Selenium 脚本
【发布时间】:2011-12-10 16:14:08
【问题描述】:

我已经准备好功能流的 Selenium 自动化脚本,现在我想将这些脚本与 JMeter 集成以进行负载测试。
这可能吗?
如果可以,如何整合两者?

我的第一个目标是使用 selenium 运行自动化脚本,而不是在 jmeter 中运行这些脚本以进行负载或性能测试。

【问题讨论】:

    标签: java selenium junit automated-tests jmeter


    【解决方案1】:

    以下是从 JMeter 运行 Selenium 测试用例的可能方法:


    JUnit 请求采样器

    如果您想重用已经自动化的 (Java) Selenium 场景而不是为 WebDriver Sampler 重新编写 JS 脚本,那么以这种方式运行 Selenium 测试可能很有用。

    硒 RC


    1. 准备 Selenium 测试项目和设置。

      1.1。下载 Selenium Java 客户端库并将 selenium-java-${version}.jar 放入 JMeter 类路径,例如%JMETER_HOME%/lib/.
      1.2. Selenium 服务器应该已启动并正在监听:

      java -jar selenium-server-standalone-${version}.jar
      

      1.3。将 Selenium 测试计划导出为 .jar 并保存到 %JMETER_HOME%/lib/junit/

      注意:您的测试类应扩展 TestCaseSeleneseTestCase 以允许 JMeter 选择此测试计划,测试用例的名称应以“test”开头) .
      注意:默认情况下,SeleneseTestCase 扩展了 JUnit 3.x TestCaseSeleneseTestCase 也期望外部 Selenium 服务器正在运行。

    2. 配置JUnit Request sampler

      2.1。在 JMeter 测试计划中添加 JUnit Request sampler.
      根据 Selenium 测试计划中的一项设置Class Name
      Test Method 设置为即将运行的测试。
      其他参数默认保留。

      JUnit 3.x 与 4.x
      JUnit Request Sampler 可以处理 JUnit3 和 JUnit4 风格的类和方法。要将 Sampler 设置为搜索 JUnit 4 测试(@Test 注释),请选中上述设置中的 Search for Junit4 annotations (instead of JUnit 3) 复选框。
      可识别以下 JUnit4 注释:

      @Test - 用于查找测试方法和类。支持“预期”和“超时”属性。
      @Before - 与 JUnit3 中的 setUp() 处理相同
      @After - 与 JUnit3 中的 tearDown() 处理相同
      @BeforeClass、@AfterClass - 被视为测试方法,因此它们可以根据需要独立运行

    3. 您已准备好使用 JMeter 开始 Selenium 测试。

    JUnit 请求采样器的 Java 代码:

    JUnit 3.x

    package com.example.tests;
    
    import com.thoughtworks.selenium.*;
    
    public class selenium extends SeleneseTestCase {
    
        private static Selenium selenium;
    
        public void setUp() throws Exception {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
            selenium.start();
            selenium.windowMaximize();
        }
    
        public void testSelenium() throws Exception {
            selenium.open("/");
            selenium.waitForPageToLoad("30000");
            Assert.assertEquals("Google", selenium.getTitle());
        }
    
        public void tearDown() throws Exception {
            selenium.close();
        }
    }
    

    JUnit 4.x

    用 JUnit 4 编写的测试脚本使用 JUnit 注释:

    package com.example.tests;
    
    import com.thoughtworks.selenium.*;
    
    import org.junit.After;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    
    public class selenium extends SeleneseTestCase {
    
        private static Selenium selenium;
    
        @Before
        public void setUp() throws Exception {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
            selenium.start();
            selenium.windowMaximize();
        }
    
        @Test
        public void testSelenium() throws Exception {
            selenium.open("/");
            selenium.waitForPageToLoad("30000");
            Assert.assertEquals("Google", selenium.getTitle());
        }
    
        @After
        public void tearDown() throws Exception {
            selenium.stop();
        }
    }
    

    Selenium 网络驱动程序


    这种情况是下面另一个答案中提到的WebDriver Sampler 的替代方案。

    先决条件

    与 Selenium RC 案例的唯一区别是 Selenium 设置准备:

    1.1。下载 selenium-server-standalone-${version}.jar 并将其放入 JMeter 类路径,例如%JMETER_HOME%/lib/
    注意:无需启动 Selenium 服务器。

    所有其他步骤与上述场景相同。

    
    package org.openqa.selenium.example;
    
    import junit.framework.TestCase;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.After;
    import org.openqa.selenium.*;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.firefox.FirefoxProfile;
    
    public class selenium extends TestCase {
        public static WebDriver driver;
    
        @Before
        public void setUp() {
            FirefoxProfile profile = new FirefoxProfile();
            driver = new FirefoxDriver(profile);
        }
    
        @Test
        public void testSelenium() throws Exception {
            driver.get("http://www.google.com/");
            Assert.assertEquals("Google", driver.getTitle());
        }
    
        @After
        public void tearDown() {
            driver.quit();
        }
    }
    

    更新。

    使用 Selenium + JUnit + JMeter 捆绑包的另一个优点和分步指南:


    BeanShell 采样器

    在这种情况下,selenium test-scenario 直接在 JMeter 的BeanShell Sampler 中执行。

    1. Selenium 设置准备与上述情况完全相同:下载 Selenium 库,放入 JMeter 类路径,启动 Selenium 服务器(在 Selenium RC 的情况下)。
    2. 将您的 selenium 测试场景放入 BeanShell Sampler:

    硒 RC

    import com.thoughtworks.selenium.*;
    import java.util.regex.Pattern;
    
    Boolean result = true;
    
    try {
        selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://www.google.com/");
        selenium.start();
        selenium.windowMaximize();
    
        selenium.open("/");
        selenium.waitForPageToLoad("30000");  
    
        if (!selenium.isTextPresent("Google")) result = false;
    } catch (Exception ex) {
        ex.printStackTrace();
        IsSuccess = false;
        ResponseCode = "500";
        ResponseMessage = ex.getMessage();
    } finally {
        selenium.stop();
    }
    
    IsSuccess = result;
    return result;
    

    Selenium 网络驱动程序

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.htmlunit.HtmlUnitDriver;
    
    Boolean result = true;
    
    try {
        driver = new HtmlUnitDriver();
        driver.setJavascriptEnabled(true);
    
        driver.get("http://www.google.com/");
    
        if (!driver.getTitle().contains("Google")) result = false;
    } catch (Exception ex) {
        ex.printStackTrace();
        IsSuccess = false;
        ResponseCode = "500";
        ResponseMessage = ex.getMessage();
    } finally {
        driver.quit();
    }
    
    IsSuccess = result;
    return result;
    

    JSR223 采样器 + Groovy

    在这种情况下,硒测试场景通过JSR223 Sampler + Groovy 执行。
    对于performance considerations,这种方法似乎比使用上述的 BeanShell 采样器更可取。

    1. Selenium 设置准备与上述情况完全相同:下载 Selenium 库,放入 JMeter 类路径,启动 Selenium 服务器(在 Selenium RC 的情况下)。
    2. 为 JSR223 Sampler 添加 Groovy 支持:

      2.1。 download latest Groovy二进制分发;
      2.2.从分发的“embeddable”文件夹中复制groovy-all-${VERSION}.jar并将其放到%JMETER_HOME%/lib/;
      2.3.重启 JMeter。

    3. 配置 JSR233 采样器:

      3.1。将 JSR233 采样器添加到线程组;
      3.2.在采样器的设置中将Script Language 设置为groovy
      3.3.将您的 selenium 测试场景放入 Script 部分(将接受 Java 代码):

    硒 RC

    import com.thoughtworks.selenium.*;
    import java.util.regex.Pattern;
    
    Boolean result = true;
    
    try {
        selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://www.google.com/");
        selenium.start();
        selenium.windowMaximize();
    
        selenium.open("/");
        selenium.waitForPageToLoad("30000");      
    
        if (!selenium.isTextPresent("Google")) result = false;
    } catch (Exception ex) {
        ex.printStackTrace();
        log.error(ex.getMessage());
         SampleResult.setSuccessful(false);
         SampleResult.setResponseCode("500");
         SampleResult.setResponseMessage(ex.getMessage());
    } finally {
        selenium.stop();
    }
    
    SampleResult.setSuccessful(result);
    return result;
    

    Selenium 网络驱动程序

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.htmlunit.HtmlUnitDriver;
    
    Boolean result = true;
    
    try {
        driver = new HtmlUnitDriver();
        driver.setJavascriptEnabled(true);
    
        driver.get("http://www.google.com/");
    
        if (!driver.getTitle().contains("Google")) result = false;
    } catch (Exception ex) {
        ex.printStackTrace();
        log.error(ex.getMessage());
         SampleResult.setSuccessful(false);
         SampleResult.setResponseCode("500");
         SampleResult.setResponseMessage(ex.getMessage());
    } finally {
        driver.quit();
    }
    
    SampleResult.setSuccessful(result);
    return result;
    

    BeanShell / JSR223 Sampler 案例的常见注意事项:

    • 使用带有测试场景(Script file 字段)的外部 .bsh / .groovy 文件,而不是直接在采样器中使用 Beanshell / Groovy 代码进行密集测试。
    • 由于 BeanShell / JSR233 采样器可以访问 JMeter 的变量,您可以直接在测试场景中设置测试(= 采样器执行)状态(通过例如 IsSuccess = STATUSSampleResult.setSuccessful(STATUS),参见上面的代码),而无需使用响应断言。

    【讨论】:

    • 据我所知,Junit4 不需要扩展 TestCase 类,我想也不需要
    • 采样器上有一个复选框,告诉它使用 junit 4 注释。如果不勾选,则必须遵守 junit 单元测试命名约定并在您的 java 类中扩展。
    【解决方案2】:

    所以基本上你先用 selenium 记录你的脚本,然后用 jmeter 重新记录 selenium 测试用例。 :-)

    http://codenaut.blogspot.com/2011/06/icefaces-load-testing.html

    【讨论】:

    • 对于简单的无身份验证网页之外的任何事情,jmeter 记录是不够的,更大的工作将是正确处理身份验证令牌和其他动态值。问题实际上是在问如何运行现有的 selenium 脚本,而不是如何创建 jmeter 脚本。
    【解决方案3】:

    有更简单的方法来运行 Selenium 脚本。

    1. 下载WebDriver plugin 并移至 lib/ 文件夹。
    2. 将 jp@gc - Firefox Driver Config 和 jp@gc - Web Driver Sampler 添加到您的测试树中

    • 添加此代码

          var pkg = JavaImporter(org.openqa.selenium)
          var support_ui = JavaImporter(org.openqa.selenium.support.ui.WebDriverWait)
          var wait = new support_ui.WebDriverWait(WDS.browser, 5000)
          WDS.sampleResult.sampleStart()
          WDS.log.info("Opening page...");
          WDS.browser.get('http://duckduckgo.com')
          var searchField = WDS.browser.findElement(pkg.By.id('search_form_input_homepage'))
          searchField.click()
          WDS.log.info("Clicked search field")
          searchField.sendKeys(['blazemeter'])
          WDS.log.info("Inserted blazemeter keyword")
          var button = WDS.browser.findElement(pkg.By.id('search_button_homepage'))
          button.click()
          WDS.log.info("Clicked search button");
          var link = WDS.browser.findElement(pkg.By.ByCssSelector('#r1-0 > div.links_main > h2 > a.large > b'))
          link.click()
          WDS.log.info("Clicked blazemeter link");
          WDS.log.info(WDS.name + ' finishing...');
          WDS.sampleResult.sampleEnd()
      
    • 运行测试

    有关代码语法和最佳实践的更多详细信息,您可以尝试Using Selenium with JMeter's WebDriver Sampler 文章。

    【讨论】:

    • 我试过了,效果很好。我不是用 Javascript 编写 Selenium 的超级粉丝,但至少它可以工作。如果我找到了 Groovy 或 java 的替代方法,我肯定会去。
    • 它不起作用我无法在视图结果树中看到结果。
    【解决方案4】:

    没有必要将 Selenium 与 JMeter 一起使用。 Selenium 脚本一次将采用一个浏览器实例。然而,JMeter 不使用浏览器的真实实例来生成负载。

    请告诉我是否可以使用 Selenium 脚本从 UI 角度为 5000 个 vuser 生成负载。应该可以吧。但是我们是说 Selenium 脚本现在需要在同一系统上运行 5000 个浏览器实例吗?测试是否仍会运行或挂起系统? JMeter 作为 Recorder 也已经有了很好的选择。它从“负载”测试的角度提供了很好的统计数据。

    暂时如果我们认为了解 Selenium 的用户不会知道如何在 JMeter 中编写脚本,因此会出现学习曲线。但在 JMeter 的情况下,这甚至不是真的。这是因为一开始就不需要创建诸如逻辑序列或程序之类的东西。

    【讨论】:

      【解决方案5】:

      虽然接受的答案确实对我很有效,但 Selenium RC 已经过时了。所以这是更新后的Selenium WebDriver 方法。

      注意:可以从接受的答案中重复使用设置。

      JUnit 请求采样器(Jupiter 测试代码)

      import org.junit.jupiter.api.Test;
      import org.openqa.selenium.By;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.WebElement;
      import org.openqa.selenium.chrome.ChromeDriver;
      
      import junit.framework.TestCase;
      
      public class SimpleGoogleSearch extends TestCase {
      
          @Test
          public void testSelenium() {
      
              // Replace the following line with the path to your chromedriver.
              System.setProperty("webdriver.chrome.driver",
                      "path to your chrome driver");
              WebDriver driver = new ChromeDriver();
              driver.get("http://www.google.com");
              WebElement searchField = driver.findElement(By.cssSelector("input[class = 'gLFyf gsfi']"));
              searchField.sendKeys("google");
              searchField.submit();
              assertEquals("google - Google Search", driver.getTitle());
              driver.close();
              driver.quit();
      
          }
      
      }
      

      JSR223 采样器 + Groovy

      ​​>

      【讨论】:

        猜你喜欢
        • 2017-12-24
        • 2021-09-24
        • 2016-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多