当前位置: 首页 > 知识库问答 >
问题:

Selenium并行测试——运行来自同一个类的2个方法

屠嘉
2023-03-14

我有一个java类,它打开两个Chrome浏览器,分别搜索“测试1”和“测试2”。然而,一旦两个浏览器都打开,只有一个带有谷歌页面的浏览器会搜索“测试1测试2”。

我相信这个问题可能是因为我从父类调用驱动程序 = 新的 WebDriver。但是,我不确定如何解决此问题。

下面是我尝试并行运行的两个方法。

package webDrivertests;

public class googleTestClass extends Methods{

    @Test
    public void test1() throws InterruptedException {

        googleTestClass object1;
        object1 = new googleTestClass();
        object1.launchBrowser();
        object1.goToURL("https://www.google.com");
        object1.enterValue("name","q","google test 1");
        driver.quit();
    }

    @Test
    public void test2() throws InterruptedException {

        googleTestClass object2;
        object2 = new googleTestClass();
        object2.launchBrowser();
        object2.goToURL("https://www.google.com");
        object2.enterValue("name","q","google test 2");
        driver.quit();
    }
}

这是我用来调用它们的xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="methods">
  <test thread-count="2" name="Test" parallel="methods">
    <classes>
      <class name="webDrivertests.googleTestClass"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

包含驱动程序的父方法

package webDrivertests;

// import statements

public class Methods {

    public static WebDriver driver;

    public void launchBrowser() {

         System.setProperty("webdriver.chrome.driver","C:\\chromedriver_win32\\chromedriver.exe");
        System.setProperty("webdriver.chrome.args", "--disable-logging");
        System.setProperty("webdriver.chrome.silentOutput", "true");
        driver = new ChromeDriver();
    }

    public void goToURL(String url) {
        driver.get(url);
    }

        public void enterValue(String htmltype, String identifier, String value) throws InterruptedException {
        if (htmltype == "id") {
            WebElement element = driver.findElement(By.id(identifier));
            element.clear();
            element.sendKeys(value);
            element.submit();
        }
        if (htmltype =="name") {
            WebElement element = driver.findElement(By.name(identifier));
            element.clear();
            element.sendKeys(value);
            element.submit();
        }

        Thread.sleep(3000);
    }

}

当前结果:打开两个浏览器,每个浏览器都指向google.com。然而,只有一个浏览器会搜索“测试1测试2”。感谢任何帮助!如果可能的话,我仍然希望使用我的父类“Methods ”,因为它包含了很多我在其他真实测试用例中使用的方法。

先谢谢你。

共有2个答案

司空祯
2023-03-14

由于类中驱动程序对象的< code>static声明,当第二次测试调用launchBrowser()时,它会覆盖并行执行。

显然,移除< code>static将会修复这个问题,但是随着测试平台和方法的增加,您仍然会遇到管理驱动程序的不同问题。

我建议使用任何满足此类要求的TestNG扩展。我们正在使用QAF,它建立在TestNG之上,提供驱动程序管理、资源管理和更多对Web/移动/Web服务测试至关重要的功能。

东门茂实
2023-03-14

问题出在您的测试代码中。WebDriver 对象被声明为静态对象。

因此,这会导致每个测试方法共享相同的实例。

要解决此问题,请从方法类中的WebDRiver声明中删除静态关键字,然后重试。

 类似资料:
  • 问题内容: 我想同时运行多个Selenium测试(在Jenkins服务器上)。 当前,由于ChromeDriver似乎通过特殊端口进行通讯,因此一次仅运行一次测试。因此,以某种方式,我想我必须通过Selenium将某种端口设置传递给ChromeDriver,以启动多个测试。 不幸的是,Selenium网站上的该主题为空:http : //docs.seleniumhq.org/docs/04_we

  • 当我试图在Selenium Grid 2旁边使用TestNG并行运行测试时,我似乎遇到了一个问题。 尽管打开的浏览器数量与我正在运行的测试数量相匹配,但所有测试的所有指令都被发送到同一个浏览器窗口。例如,每个测试都会打开一个页面并尝试登录。四个浏览器窗口将打开,但一个浏览器窗口将导航到登录页面四次,然后键入用户名四次,而其余的浏览器窗口保持不活动。 以下是我如何启动网格: xml套件是这样设置的:

  • 问题 我有一堆jUnit测试(许多具有自定义运行器,例如PowerMockRunner或JUnitParamsRunner)都在一些根包下(它们在的不同深度的不同子包中)。 我想收集包<code>tests<code>下的所有测试,并在不同的JVM中并行运行每个测试类。理想情况下,并行化是可配置的,但默认的number_of_cores也完全可以。请注意,我不想在自己的JVM中运行每个方法,而是要

  • 我有一个主要的“抽象”类宠物,和两个“真实”类狗和猫。当我有两个宠物的例子时,我想知道它们是否是“同一种宠物”,而不考虑它们是哪种宠物。 我试过这个 我尝试了所有评论的返回,它总是给出这样的结果: 有没有办法在主类中进行这样的测试以避免代码重复? 编辑: 多人提到它忘记了子类化部分 这可以按预期工作

  • 我的自动化测试有一些问题。我的EclipseIDE中大约有50个测试用例。所有测试用例都在不同的类中。另外,我还有一个基类,它包含@beforeclass和@afterclass。在@beforeclass中,浏览器打开,URL打开,网站URL打开,然后执行登录过程。然后我的测试用例工作。它们都以@Test注释开始。我使用TestNG套件将它们连接起来。基类:我的基类。java类MyBaseCla

  • 我的Java包中有四个类。只有一个类具有方法。 当我运行方法时,我如何运行这四个类中的所有方法? 以下是我的课程: 第一类。JAVA 第二类。爪哇 第三类。JAVA 样品。JAVA