gpt4 book ai didi

java - 访问辅助类中的实例变量

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:03 25 4
gpt4 key购买 nike

免责声明:我有动态语言背景 (Ruby),我正在努力提高我的 Java 技能。我担心这里的问题是我在 Ruby 的上下文中想得太多,希望得到一些指示。

问题:

我想看看如何让帮助程序类知道 WebDriver 实例的存在,而不必一直传递该实例。我试图避免这种情况的原因是因为它会导致额外的方法参数和不太流畅的测试编写。

上下文:

我有一个如下所示的测试用例 (LoginIT.java):

package com.testerstories.learning.symbiote;

import static com.testerstories.learning.helpers.Selenium.*;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;

public class LoginIT {
WebDriver driver;

@BeforeTest
public void startBrowser() {
driver = new FirefoxDriver();
}

@AfterTest
public void quitBrowser() {
driver.quit();
}

@Test
public void loginAsAdmin() {
driver.get("http://localhost:9292");

withElement("open").click();

waitForPresence("username");

withElement("username").sendKeys("admin");
withElement("password").sendKeys("admin");
withElement("login-button").submit();

waitForPresence("notice");

assertThat(withElement("notice", "className"), equalTo("You are now logged in as admin."));
}
}

这里要注意的关键方法是对 withElementwaitForPresence 的调用。这些是在我创建的 Selenium 类上定义的,并通过顶部的静态导入进行引用。

这是包含该逻辑的 Selenium.java:

package com.testerstories.learning.helpers;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium {
public static WebElement withElement(String identifier, String locator) {
switch (locator) {
case "className":
return driver.findElement(By.className(identifier));
default:
return withElement(identifier);
}
}

public static WebElement withElement(String identifier) {
return driver.findElement(By.id(identifier));
}

public static void waitForPresence(String identifier, String locator) {
WebDriverWait wait = new WebDriverWait(driver, 10, 500);

switch (locator) {
case "className":
wait.until(ExpectedConditions.visibilityOfElementLocated(By.className(identifier)));
default:
waitForPresence(identifier);
}
}

public static void waitForPresence(String identifier) {
WebDriverWait wait = new WebDriverWait(driver, 10, 500);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(identifier)));

}
}

这里的关键问题是引用 driver 的行。当这些方法在 LoginIT.java 中定义时,这不是问题,因为 WebDriver 是在 driver 实例中定义的。

我确实知道我的问题的一个答案是我可以将 WebDriver 实例传递给每个方法。因此,例如,我可以将此方法签名与 withElement 一起使用:

public static WebElement withElement(WebDriver driver, String identifier)

我正在添加另一个参数以传入 WebDriver 实例。但这意味着我的测试逻辑必须如下所示:

withElement(driver, "username").sendKeys("admin");
withElement(driver, "password").sendKeys("admin");
withElement(driver, "login-button").submit();

不是世界末日,但它不太流畅,似乎应该有更好的方法。

问题:

有没有更好的办法?

或者我实际上是在正确的轨道上,应该接受如果我希望辅助方法与测试分开,则必须传入 driver 引用?从而接受稍微冗长的测试语句?

其他想法:

我能立即想到的唯一另一件事是我创建了第三个类,它只代表 WebDriver 本身。然后我的测试 (LoginIt.java) 和我的测试助手 (Selenium.java) 都会使用这第三个类。我不确定如何最好地实现它,但我也不确定走这条路是否有意义。

我这么说是因为如果我这样做,我只是在创建一个类来包装 WebDriver 实例的创建。所以我必须创建一个类,然后获取该类的实例,这样我才能创建 WebDriver 的实例。好像我在增加复杂性……但也许不是。因此我寻求指点。

最佳答案

另一种方法可能是让您的 Selenium 类被初始化。您可以在类构造函数中要求 WebDriver 引用,而不是让这些方法是静态的。

package com.testerstories.learning.helpers;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium {
private final WebDriver driver;
public Selenium(WebDriver webDriver) {
this.driver = webDriver;
}

public WebElement withElement(String identifier, String locator) {
switch (locator) {
case "className":
return driver.findElement(By.className(identifier));
default:
return withElement(identifier);
}
}

public WebElement withElement(String identifier) {
return driver.findElement(By.id(identifier));
}

public void waitForPresence(String identifier, String locator) {
WebDriverWait wait = new WebDriverWait(driver, 10, 500);

switch (locator) {
case "className":
wait.until(ExpectedConditions.visibilityOfElementLocated(By.className(identifier)));
default:
waitForPresence(identifier);
}
}

public void waitForPresence(String identifier) {
WebDriverWait wait = new WebDriverWait(driver, 10, 500);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(identifier)));

}
}

然后您的 LoginIT.java 将在 @Before 中初始化引用以及驱动程序,并将以前的静态调用更改为您建立的实例:

package com.testerstories.learning.symbiote;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import com.testerstories.learning.helpers.Selenium;

public class LoginIT {
WebDriver driver;
Selenium selenium;

@BeforeTest
public void startBrowser() {
driver = new FirefoxDriver();
selenium = new Selenium(driver);
}

@AfterTest
public void quitBrowser() {
driver.quit();
}

@Test
public void loginAsAdmin() {
driver.get("http://localhost:9292");

selenium.withElement("open").click();

selenium.waitForPresence("username");

selenium.withElement("username").sendKeys("admin");
selenium.withElement("password").sendKeys("admin");
selenium.withElement("login-button").submit();

selenium.waitForPresence("notice");

assertThat(selenium.withElement("notice", "className"), equalTo("You are now logged in as admin."));
}
}

关于java - 访问辅助类中的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34561035/

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