我浏览了该网站,但没有找到我正在寻找的答案。
我有
我只是一个初学者,还没有尝试过 browserfactory 和其他选项,因为我想从简单的流程开始。
超类
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
}
您能在这里指导我吗?我怎样才能达到同样的效果。
非常感谢!
SuperClass
和BaseClass
是非常糟糕的名字。不要使用编码语言来命名您的类,使用问题的语言。在这种情况下,网站应用程序测试,使用 LoginPage、CartPage、ProfilePage 等。使用 Page Object Pattern。
我建议您使用工厂模式为每个测试提供WebDriver实例。由于所有这些都符合“是页面”的想法,因此使用标准 PageObject 的类扩展来提供此功能。导航时,让当前页面构造新页面的实例并向其传递当前 webDriver
连接实例。然后,您应用于该 PageObject 的任何操作都将自动应用于该 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;
}
}
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());
}
setup()
时,我使用“浏览器”系统属性来获取浏览器名称。就我而言,我使用 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
}
}