Is there a way to call a java method that extends a webdriver class?(有没有一种方法可以调用扩展Web驱动程序类的Java方法?)
问题描述
我正在使用WebDriverManager Java库。它提供了一个通用管理器,可以被参数化为特定的管理器(对于Chrome、Firefox等)。我将它与Selify WebDriver和JUnit5的@PARAMETIZED和@ValueSource注释一起使用,这样我就可以在多个浏览器上运行我的测试。 我按照WebDriverManager文档创建了一个实现:
public class WebTest {
WebDriver driver = null;
@ParameterizedTest
@ValueSource(classes = { ChromeDriver.class, FirefoxDriver.class })
public void navigateToUrl(String url, Class<? extends WebDriver> webDriverClass) { //WebDriver class gets extended
driver = WebDriverManager.getInstance(webDriverClass).create();
driver.manage().window().maximize();
driver.get(url);
在包含黄瓜步骤定义的类中,我尝试调用navigateToUrl
方法,但出现如下编译错误:
public class WebAppStepDefinitions {
private final WebTest webTest = new WebTest();
@Given("^I have navigated to the web url "([^"]*)"$")
public void navigateToUrl(String url) {
webTest.navigateToUrl(url, Class<? extends WebDriver > webDriverClass); //error on this line: `Cannot resolve symbol webDriverClass`
}
如何正确调用位于WebTest
类中的navigateToUrl
?
推荐答案
根据@ValueSource documentation,您不能使用此注释来传递某些类的实例。该批注只能用于传递原始值、字符串和类(不能传递对象)。您可以使用这些类来测试某个方法或某个对象是否为参数类的实例。不能使用它将实例传递给方法。
而不是,您可以做的是使用@MethodSource API传递方法的名称,该方法可以为您提供(返回)那些实例(查找谈论多个参数的段落)。例如,我认为您可以这样做:
@ParameterizedTest
@MethodSource("getWebDrivers")
public void navigateToUrl(String url, List<WebDriver> drivers) {
driver = WebDriverManager.getInstance(webDriverClass).create();
driver.manage().window().maximize();
driver.get(url);
}
public Stream<Arguments> getWebDriversAndUrl() {
List<WebDrivers> drivers = new ArrayList<>();
... // Here you need to instantiate your drivers (skip if you have them already instantiated and set as global variables.
drivers.add(chromeDriver);
drivers.add(firefoxDriver);
return return Stream.of(
arguments("url1", drivers),
arguments("url2", drivers);
}
更新:
您的实现有一个编译错误,因为您未能在步骤定义中声明Web驱动程序类的参数。步骤定义只有一个参数。此行webTest.navigateToUrl(String url, Class<? extends WebDriver > webDriverClass);
需要
webTest.navigateToUrl(url, webDriverClass);
问题是您在步骤定义中有一个作为参数传递的URL,而不是Class
对象。
如果从步骤定义内部调用该方法,则甚至不需要使用@ValueSource
。您只需要一个数据表,并以这种方式直接从步骤定义传递参数:
@Given("^I have navigated to the web url$")
public void navigateToUrl(DataTable table) {
List<list> data = table.raw();
// iterate thru list and call driver.get(url);
}
您的测试步骤应该如下所示:
Given I have navigated to the web url
| url | chrome |
| url | firefox |
由于您不能直接传递Class
实例,因为它不是Cucumber支持的数据类型,因此创建自定义类型比使用此用例更麻烦。您将使用WebDriverManager
getIntance()
,并使用浏览器名称而不是驱动程序类。
这篇关于有没有一种方法可以调用扩展Web驱动程序类的Java方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:有没有一种方法可以调用扩展Web驱动程序类的Java方法?
基础教程推荐
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01