我浏览了网站,但没有找到我正在寻找的答案。
我有
我只是一个初学者,并没有尝试过browserfactory和其他选项,因为我想从简单的流程开始。
超类
Public class Superclass
{
public webdriver Driver;
}
基类
public class Baseclass extends Superclass
{
setting capabilities and launching the browser
}
ClickLink
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
}
你可以在这里指导我吗?我怎样才能达到同样的目的。
非常感谢!
答案 0 :(得分:1)
不要使用编码语言来命名您的课程; SuperClass和BaseClass是非常糟糕的名字。而是使用问题的语言来命名。在这种情况下,网站应用程序测试,甚至更好的LoginPage,CartPage,ProfilePage等使用Page Object Pattern。使用BrowserFactory提供WebDriver的实例
public abstract class PageObject {
public WebDriver driver;
PageObject() {
// Page can initialise its self
this.driver = BrowserFactory.webDriver();
}
PageObject(final WebDriver webDriver) {
this.driver = webDriver;
}
}
答案 1 :(得分:1)
这是我身边的很多猜测,但请确保您的超类实际上设置了驱动程序并将其返回。你可以用两种方法实现它:
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());
}
答案 2 :(得分:0)
如果您不希望将驱动程序实例传递给Page Objects构造函数,则可以为驱动程序创建一些容器类,并在测试之前将其放入并在运行后将其删除。例如:
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;
}
}
并设置此容器字段ThreadLocal以避免并行运行出现问题。
答案 3 :(得分:0)
I did use below code in utility class like below
public static WebDriver setup(WebDriver driver)
{
if(driver == null) {
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
return driver;
}else
return driver;
//System.out.println("in method "+ driver.getTitle() );
}
答案 4 :(得分:0)
在此线程上,我采用的方法与大多数方法略有不同。开始测试会话时,我将浏览器名称作为参数传递(即-Dbrowser = chrome),以便能够使用不同的浏览器测试我的Web应用程序。然后,当我的测试框架调用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
}
}