Java 如何将selenium webdriver实例传递给另一个类
我浏览了这个网站,但没有找到我正在寻找的答案 我有Java 如何将selenium webdriver实例传递给另一个类,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我浏览了这个网站,但没有找到我正在寻找的答案 我有 超级基类-这里我只是创建一个webdriver的对象 基类-在这个类中,我扩展了Superbase类,调用驱动程序并打开URL Clicklink类-在这个类中,我再次扩展了Superbase类,但只发现了一个空指针异常。我想我得到了异常,因为驱动程序对象没有初始化 我只是一个初学者,还没有尝试过browserfactory和其他选项,因为我想从简单的流开始 超类 Public class Superclass { public
Public class Superclass
{
public webdriver Driver;
}
基类
public class Baseclass extends Superclass
{
setting capabilities and launching the browser
}
点击链接
public class Clicklink extends Superclass
{
here I want to click on a link
driver.findelement(by.xpath("xpath").click());
// after this statement I get a null pointer exception
}
你能带我到这里吗?我怎样才能达到同样的效果
多谢
超类
和基类
是非常糟糕的名称。不要用编码语言来命名你的类,使用问题语言。在本例中,对网站应用程序进行测试时,请使用LoginPage、CartPage、ProfilePage等
我建议您使用Factory模式为每个测试提供WebDriver实例。因为所有这些都符合页面的概念,所以使用来自标准PageObject的类扩展来提供此功能。导航时,让当前页面构造新页面的实例,并将当前webDriver
连接实例传递给它。然后,应用于该页面对象的任何操作都将自动应用于该webDriver实例及其关联的浏览器实例。您还应该使用PageFactory
来提供pageObject的实例
public abstract class PageObject {
public WebDriver driver;
PageObject() {
// Page can initialise its self
this.driver = BrowserFactory.webDriver();
}
PageObject(final WebDriver webDriver) {
this.driver = webDriver;
}
}
超类
和基类
是非常糟糕的名称。不要用编码语言来命名你的类,使用问题语言。在本例中,对网站应用程序进行测试时,请使用LoginPage、CartPage、ProfilePage等
我建议您使用Factory模式为每个测试提供WebDriver实例。因为所有这些都符合页面的概念,所以使用来自标准PageObject的类扩展来提供此功能。导航时,让当前页面构造新页面的实例,并将当前webDriver
连接实例传递给它。然后,应用于该页面对象的任何操作都将自动应用于该webDriver实例及其关联的浏览器实例。您还应该使用PageFactory
来提供pageObject的实例
public abstract class PageObject {
public WebDriver driver;
PageObject() {
// Page can initialise its self
this.driver = BrowserFactory.webDriver();
}
PageObject(final WebDriver webDriver) {
this.driver = webDriver;
}
}
若您不想将驱动程序实例传递给页面对象构造函数,那个么可以为驱动程序创建一些容器类,并将其放在测试之前,然后在运行之后将其删除。例如:
class Driver {
public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>();
public static IWebDriver GetDriver() {
return driverInstance.Value;
}
public static void SetDriver(IWebDriver driver) {
driverInstance.Value = driver;
}
}
类驱动程序{
public static ThreadLocal driverInstance=new ThreadLocal();
公共静态IWebDriver GetDriver(){
返回driverInstance.Value;
}
公共静态无效设置驱动程序(IWebDriver驱动程序){
driverInstance.Value=驱动程序;
}
}
并创建此容器字段以避免并行运行时出现问题。如果您不想将驱动程序实例传递给页面对象构造函数,则可以为驱动程序创建一些容器类,并将其放在测试之前,然后在运行之后将其删除。例如:
class Driver {
public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>();
public static IWebDriver GetDriver() {
return driverInstance.Value;
}
public static void SetDriver(IWebDriver driver) {
driverInstance.Value = driver;
}
}
类驱动程序{
public static ThreadLocal driverInstance=new ThreadLocal();
公共静态IWebDriver GetDriver(){
返回driverInstance.Value;
}
公共静态无效设置驱动程序(IWebDriver驱动程序){
driverInstance.Value=驱动程序;
}
}
并创建此容器字段以避免并行运行时出现问题。我这边做了很多猜测,但请确保您的超类确实设置了驱动程序并返回它。实际上,您可以通过两种方法实现:
public class Superclass
{
public WebDriver driver;
public Superclass(){
driver = new FirefoxDriver();
}
public WebDriver getdriver(){
if (driver == null){
driver = new FirefoxDriver();
return driver;
}else{
return driver;
}
}
}
稍后在您调用它的方法中:
public class Clicklink extends Superclass
{
getdriver().findelement(by.xpath("xpath").click());
}
我这边做了很多猜测,但请确保您的超类确实设置了驱动程序并返回它。实际上,您可以通过两种方法实现:
public class Superclass
{
public WebDriver driver;
public Superclass(){
driver = new FirefoxDriver();
}
public WebDriver getdriver(){
if (driver == null){
driver = new FirefoxDriver();
return driver;
}else{
return driver;
}
}
}
稍后在您调用它的方法中:
public class Clicklink extends Superclass
{
getdriver().findelement(by.xpath("xpath").click());
}
在这个问题上,我采取了与大多数人稍有不同的方法。启动测试会话时,我将浏览器名称作为参数传递(即-Dbrowser=chrome),以便能够使用不同的浏览器测试我的web应用程序。然后,当我的测试框架调用
setup()
时,我使用“browser”系统属性获取浏览器名称。在我的例子中,我使用JUnit注释以便JUnit在运行任何测试之前设置所有需要的依赖项
@BeforeClass
public static void setup() throws Exception {
// Set up other stuff
String browser = System.getProperty("browser");
try {
SessionDataProvider.driver = TestUtils.createDriver(browser);
} catch (Exception e) {
...
}
}
createDriver(String)
是一个工厂方法,用于实例化正确的驱动程序
public static WebDriver createDriver(String browserName) throws Exception {
WebDriver driver = null;
try {
switch(browserName) {
case "firefox":
// code to system props and instantiate the driver
break;
case "chrome":
// code to system props and instantiate the driver
break;
case "ibrowser":
// code to system props and instantiate the driver
break;
case "edge":
// code to system props and instantiate the driver
break;
case "safari":
// code to system props and instantiate the driver
break;
default:
throw new Exception("Unsupported browser: " + browserName);
}
return driver;
}
然后,当我执行步骤定义时,我只需从数据提供程序类获取驱动程序:
@And("(I click)/Click on {string}")
public void click(String arg) {
// Parse String arg and create web element locator...
try {
By locator = ...;
WebElement element = new WebDriverWait(SessionDataProvider.driver, 2)
.until(ExpectedConditions.elementToBeClickable(locator));
element.click();
} catch (Exception e) {
// handle exception
}
}
在这个问题上,我采取了与大多数人稍有不同的方法。启动测试会话时,我将浏览器名称作为参数传递(即-Dbrowser=chrome),以便能够使用不同的浏览器测试我的web应用程序。然后,当我的测试框架调用
setup()
时,我使用“browser”系统属性获取浏览器名称。在我的例子中,我使用JUnit注释以便JUnit在运行任何测试之前设置所有需要的依赖项
@BeforeClass
public static void setup() throws Exception {
// Set up other stuff
String browser = System.getProperty("browser");
try {
SessionDataProvider.driver = TestUtils.createDriver(browser);
} catch (Exception e) {
...
}
}
createDriver(String)
是一个工厂方法,用于实例化正确的驱动程序
public static WebDriver createDriver(String browserName) throws Exception {
WebDriver driver = null;
try {
switch(browserName) {
case "firefox":
// code to system props and instantiate the driver
break;
case "chrome":
// code to system props and instantiate the driver
break;
case "ibrowser":
// code to system props and instantiate the driver
break;
case "edge":
// code to system props and instantiate the driver
break;
case "safari":
// code to system props and instantiate the driver
break;
default:
throw new Exception("Unsupported browser: " + browserName);
}
return driver;
}
然后,当我执行步骤定义时,我只需从数据提供程序类获取驱动程序:
@And("(I click)/Click on {string}")
public void click(String arg) {
// Parse String arg and create web element locator...
try {
By locator = ...;
WebElement element = new WebDriverWait(SessionDataProvider.driver, 2)
.until(ExpectedConditions.elementToBeClickable(locator));
element.click();
} catch (Exception e) {
// handle exception
}
}
请显示您的方法。是在*方法之前的
@Before*
方法中还是在构造函数中“设置功能并启动浏览器”?可能是在child中创建一个超类对象,然后通过它调用它。超类sl=新的超类();sl.driver.findelement(by.xpath(“xpath”).click();我不能在这里发布方法,因为它来自客户端计算机,但是,下面是它在超类中的外观没有方法,只有基类中的一个公共驱动变量,我有1个方法,它打开浏览器并验证页面标题。在Clicklink类中,我有两个方法首先创建objec