gpt4 book ai didi

java - 如何在 Selenium Grid 上对两个单例浏览器进行多线程处理?

转载 作者:行者123 更新时间:2023-12-02 01:16:58 36 4
gpt4 key购买 nike

我正在构建一个项目,并偶然发现了 Selenium Grid 的多线程。我有两个浏览器设置扩展了我需要运行的 selenium 包装页面(Chrome 驱动程序和 Firefox 驱动程序)。

我分别阅读了很多有关多线程和单例模式的文章,但不知道如何使它们一起工作。

测试:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="selenium" verbose="1" thread-count="2" parallel="tests">
<test name="ChromeTest">
<parameter name="browserName" value="chrome"/>
<classes>
<class name="Run.CucumberRunner"/>
</classes>
</test>
<test name="FirefoxTest">
<parameter name="browserName" value="firefox"/>
<classes>
<class name="Run.CucumberRunner"/>
</classes>
</test>
</suite>

cucumber 运行者:

@CucumberOptions(
features = "src/test/resources/features",
glue = "Run",
plugin = "io.qameta.allure.cucumber4jvm.AllureCucumber4Jvm"
)
public class CucumberRunner extends AbstractTestNGCucumberTests {

private static final Logger LOG = LogManager.getLogger(CucumberRunner.class);

@Parameters({"browserName"})
@BeforeTest()
public void setUp(String browserName) {

if (browserName.equals("chrome")){
CustomChromeDriver chromeDriver = CustomChromeDriver.getInstance();
} else if (browserName.equals("firefox")){
CustomFirefoxDriver firefoxDriver = CustomFirefoxDriver.getInstance();
}
}
}

浏览器实例之一:

class CustomChromeDriver extends BasicDriver {

private String HUB = "http://192.168.2.105:4444/wd/hub";

private WebDriverWait wait;

private static CustomChromeDriver chrome;

public static CustomChromeDriver getInstance() {
if (chrome == null) {
chrome = new CustomChromeDriver();
}
return chrome;
}

private CustomChromeDriver() {

wait = new WebDriverWait(remoteWebDriver, 10);
System.setProperty("webdriver.chrome.driver", "bin/chromedriver.exe");

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setBrowserName("chrome");

try {
remoteWebDriver = new RemoteWebDriver(new URL(HUB), capabilities);
} catch (MalformedURLException e) {

}
}

}

步骤定义:


public class StepDefinitions {

private MainPage mainPage = new MainPage();

private static final Logger LOG = LogManager.getLogger(StepDefinitions.class);

private String testHost = "https://www.google.com/gmail/";


@Step ("Opening test host")
@Given("test host open")
public void openHost() {
mainPage.navigate(this.testHost);
LOG.debug("Test host opened");
}

页面对象的父页面

public abstract class BasicPage {


public BasicDriver basicDriver;


public void navigate(String url) {
basicDriver.get(url);
}


public void shutDown(){
basicDriver.close();
}

}

堆栈跟踪片段:

java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:221)
at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:106)
at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:85)
at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:45)
at Run.CustomChromeDriver.<init>(CustomChromeDriver.java:49)
at Run.CustomChromeDriver.getInstance(CustomChromeDriver.java:37)

最佳答案

  1. 你的脚本的主要问题是你正在尝试实例化WebDriverWait通过提供尚未初始化的 remoteWebDriver 实例。
  2. 考虑删除 static来自任何假定 WebDriver 的类的访问修饰符和衍生品使用
  3. 考虑放置 WebDriver 和所有不属于 thread-safe 的实体进入ThreadLocal

更多信息:Parallel Tests - Best Practices

关于java - 如何在 Selenium Grid 上对两个单例浏览器进行多线程处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655048/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com