有没有办法调用扩展网络驱动程序 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 支持的数据类型,创建自定义类型对于这个用例来说麻烦多于它的价值。您将使用 WebDriverManagergetIntance() 使用浏览器名称而不是驱动程序 class。