有没有办法调用扩展网络驱动程序 class 的 java 方法?
Is there a way to call a java method that extends a webdriver class?
我正在使用 WebDriverManager java 库。它提供了一个通用管理器,可以将其参数化以充当特定管理器(对于 Chrome、Firefox 等)。我将它与 Selenium Webdriver 和 Junit 5 的 @Parameterized 和 @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);
在包含我的 Cucumber 步骤定义的 class 中,我尝试调用 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
class 的 navigateToUrl
?
根据 @ValueSource documentation,您不能使用此注释来传递某些 class 的实例。此注释只能用于传递原始值、字符串和 类(不是对象)。您可以使用 classes 来测试某个方法或某个对象是否是参数 class 的实例。您不能使用它来将实例传递给方法。
INSTEAD,您可以做的是使用 @MethodSource API 传递可以为您提供 (return) 这些实例的方法的名称(寻找谈论多个参数的段落)。例如,我认为你可以这样做:
@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);
}
更新:
您的实现存在编译错误,因为您未能在步骤定义中声明网络驱动程序 class 的参数。步骤定义只有一个参数。这一行
webTest.navigateToUrl(String url, Class<? extends WebDriver > webDriverClass);
需要
webTest.navigateToUrl(url, webDriverClass);
问题是您有一个 URL 作为步骤定义中的参数传递,但不是 Class
对象。
如果从步骤定义内部调用方法,甚至不需要使用 @ValueSource
。您只需要一个数据 table 并直接从步骤定义中传递参数:
@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()
使用浏览器名称而不是驱动程序 class。
我正在使用 WebDriverManager java 库。它提供了一个通用管理器,可以将其参数化以充当特定管理器(对于 Chrome、Firefox 等)。我将它与 Selenium Webdriver 和 Junit 5 的 @Parameterized 和 @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);
在包含我的 Cucumber 步骤定义的 class 中,我尝试调用 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
class 的 navigateToUrl
?
根据 @ValueSource documentation,您不能使用此注释来传递某些 class 的实例。此注释只能用于传递原始值、字符串和 类(不是对象)。您可以使用 classes 来测试某个方法或某个对象是否是参数 class 的实例。您不能使用它来将实例传递给方法。
INSTEAD,您可以做的是使用 @MethodSource API 传递可以为您提供 (return) 这些实例的方法的名称(寻找谈论多个参数的段落)。例如,我认为你可以这样做:
@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);
}
更新:
您的实现存在编译错误,因为您未能在步骤定义中声明网络驱动程序 class 的参数。步骤定义只有一个参数。这一行
webTest.navigateToUrl(String url, Class<? extends WebDriver > webDriverClass);
需要
webTest.navigateToUrl(url, webDriverClass);
问题是您有一个 URL 作为步骤定义中的参数传递,但不是 Class
对象。
如果从步骤定义内部调用方法,甚至不需要使用 @ValueSource
。您只需要一个数据 table 并直接从步骤定义中传递参数:
@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()
使用浏览器名称而不是驱动程序 class。