无法从BasePage类中放置驱动程序 - 使用强制转换的异常 - 使用屏幕截图设置测试侦听器

时间:2018-02-08 18:36:20

标签: java selenium selenium-webdriver testng pop

我有DriverFactory类,它返回Driver by属性。 这是一个扩展BasePage类的RegistrationPage类。和RegistrationTest类在哪里是初始化驱动程序的@BeforeClass方法。 我还有TestListenerClass,我想在onTestFailureMethod中实现在失败的测试用例期间截取屏幕截图。但是有问题把驱动程序放在Screenshot方法中 - 不能从BasePage中获取它(铸造问题)。我也尝试在屏幕截图方法中再次启动它,但启动另一个webdriver是错误的。代码如下所示:

public class DriverFactory {

public enum BrowserType{
    FIREFOX("firefox"),
    CHROME("chrome"),
    IE("internet_explorer"),
    SAFARI("safari");

    private String value;

    BrowserType(String value){
        this.value = value;
    }

    public String getBrowserName(){
        return this.value;
    }

}

public static WebDriver getDriver(BrowserType type){

    WebDriver driver = null;
    switch(type){
        case FIREFOX:
            System.setProperty("webdriver.gecko.driver","D://DemoQA//drivers//geckodriver.exe");
            driver = new FirefoxDriver();
            break;
        case CHROME:
            System.setProperty("webdriver.chrome.driver","D://DemoQA//drivers//chromedriver.exe");
            driver = new ChromeDriver();
            break;
        case IE:
            driver = new InternetExplorerDriver();
            break;
        case SAFARI:
            driver = new SafariDriver();
            break;
        default:
            System.setProperty("webdriver.chrome.driver","D://DemoQA//drivers//chromedriver.exe");
            driver = new ChromeDriver();
            break;
    }
    return driver;
}

public static BrowserType getBrowserTypeByProperty(){
    BrowserType type = null;
    String browserName = junitx.util.PropertyManager.getProperty("BROWSER");
    for(BrowserType bType : BrowserType.values()){
        if(bType.getBrowserName().equalsIgnoreCase(browserName)){
            type = bType;
            System.out.println("BROWSER = " + type.getBrowserName());
        }
    }
    return type;
}

}



public class BasePage {

public WebDriver driver;
public WebDriverWait wait;

public String PAGE_TITLE;
public String PAGE_URL;


public BasePage(WebDriver driver){
    this.driver = driver;
    wait = new WebDriverWait(driver, 5, 1000);
}

public void loadPage(){
    driver.get(getPageURL());
    Assert.assertEquals(driver.getTitle(), getPageTitle());
}
....


}



public class RegistrationPage extends BasePage {


@FindBy(className = "piereg_message") WebElement registeredCorrectHeader;
.....


public RegistrationPage(WebDriver driver){
    super(driver);
    this.PAGE_TITLE = "Registration | Demoqa";
    this.PAGE_URL = "http://demoqa.com/registration/";
}

public void setTextFirstNameField(String text){
    setTextOnElement(firstNameField, text);
}

....
}




public class TestListener extends TestListenerAdapter {

private WebDriver driver;

@Override
public void onTestFailure(ITestResult testResult){

    System.out.println(testResult.getName() + " was failure. \n Throwable " + testResult.getThrowable().getMessage());

    driver = ((BasePage)testResult.getInstance()).driver;

    Screenshots.captureScreenshot(driver, RandomValuesGenerator.generateRandomString(4));

}

}





@Listeners(TestListener.class)
public class RegistrationTest{

public WebDriver driver;
RegistrationPage registrationPage;

@BeforeClass(alwaysRun = true)
public void setup(){
    this.driver = getDriver( DriverFactory.getBrowserTypeByProperty() );
    driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    registrationPage = PageFactory.initElements(driver, RegistrationPage.class);
}

@Test()
public void testLoginRegistrationPage() throws Exception{
    driver.manage().deleteAllCookies();
    registrationPage.loadPage();
    registrationPage.setTextFirstNameField("Michal");
    registrationPage.setTextLastNameField("Kowalewski");
}

问题肯定在这行代码中:

  driver = ((BasePage)testResult.getInstance()).driver; 
  Screenshots.captureScreenshot(driver, RandomValuesGenerator.generateRandomString(4)); 

异常 - 无法将BasePage强制转换为RegistrationTest - 我想将驱动程序从BasePage转换为onFailure方法

我也试过这样的东西,但是第二次初始化了驱动程序,浏览器再次打开,并拍摄了空截图。

this.driver = 
DriverFactory.getDriver(DriverFactory.getBrowserTypeByProperty());

如何将驱动程序置于Failure方法中并且第二次不进行初始化?

此致

0 个答案:

没有答案