2017-07-18 42 views
0

我试图让POM(PageFactory)基于TestNG的框架,但我面临的问题与传递webdriver的实例,第二TestCase的文件..如何使用TestNG.XML一个接一个地运行多个PageFactory页面?

这是我的试验基地(初始化浏览器和log4j的)

public class TestBase { 
    public static WebDriver driver; 
    public static FileInputStream fip; 
    public static Properties prop; 
    //public static Logger APP_LOGS=null; 
    //public static SoftAssert st=null; 
    public static boolean TestFail=false; 
    public static int temp=0; 
    public static final Logger APP_LOGS=Logger.getLogger(TestBase.class.getName()); 

    public static WebDriver initialization() throws Throwable{ 
     fip=new FileInputStream("./Files/or.properties"); 
     prop=new Properties(); 
     prop.load(fip); 
     //APP_LOGS.debug("properties file is loaded"); 
     String browser=prop.getProperty("browsertype"); 
      //System.out.println("5"); 
     if(browser.equalsIgnoreCase("mozilla")){ 
      System.setProperty("webdriver.gecko.driver", "./drivers/geckodriver.exe"); 
      driver= new FirefoxDriver(); 
      //APP_LOGS.debug("Mozilla fire fox browser started"); 
     } 
     else if (browser.equalsIgnoreCase("ie")){ 
      System.setProperty("webdriver.ie.driver", "./drivers/IEDriverServer.exe"); 
      driver=new InternetExplorerDriver(); 
      //APP_LOGS.debug("InternetExplorer browser started"); 
     } else if(browser.equalsIgnoreCase("chrome")){ 
      System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe"); 
      driver=new ChromeDriver(); 
      //APP_LOGS.debug("Chrome browser started"); 
     } 
     driver.get(prop.getProperty("url")); 
     //driver.manage().window().maximize(); 
     String log4jConfPath = "log4j.properties"; 
     PropertyConfigurator.configure(log4jConfPath); 
     APP_LOGS.info("Opened "+prop.getProperty("browsertype")+" browser");    
     APP_LOGS.info("Navigated to Seleniumeasy.com/test"); 

     driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
     return driver; 

    } 

上面的代码我在我的测试PAGE..ie InputFormSubmitPage(下)扩展

public class InputFormSubmitPage extends TestBase{ 

    WebDriver driver; 

    public InputFormSubmitPage(WebDriver driver) { 
     this.driver=driver; 
     PageFactory.initElements(driver, this); 
    } 

    //INPUTFORM SUBMIT -- Objects Locators 

    @FindBy(how=How.XPATH, using="//*[@id='treemenu']/li/ul/li[1]/a") WebElement inputformlink;  
    @FindBy(how=How.XPATH, using="//*[@id='treemenu']/li/ul/li[1]/ul/li[5]/a") WebElement inputFormSubmit; 
    @FindBy(how=How.CSS, using="[name='first_name'][placeholder='First Name']") WebElement firstName; 
    @FindBy(how=How.CSS, using="[name='last_name'][placeholder='Last Name']") WebElement lastName; 
    @FindBy(how=How.CSS, using="[name='email'][placeholder='E-Mail Address']") WebElement eMail; 
    @FindBy(how=How.CSS, using="[name='phone'][data-bv-field='phone']") WebElement phoneNumber; 
    @FindBy(how=How.CSS, using="[name='address'][placeholder='Address']") WebElement address; 
    @FindBy(how=How.CSS, using="[name='city'][placeholder='city']") WebElement city; 
    @FindBy(how=How.CSS, using=".form-control.selectpicker") WebElement state; 
    @FindBy(how=How.CSS, using="[name='zip'].form-control") WebElement zipCode; 
    @FindBy(how=How.CSS, using="[name='comment'][placeholder='Project Description']") WebElement projDescription; 
    @FindBy(how=How.CSS, using=".btn.btn-default") WebElement sendButton; 
    //@FindBy(how=How.CSS, using="div[class$='has-error']>div>small[data-bv-result='INVALID']") WebElement allFieldsValidationErrorMessages_Invalid; 
    //@FindBy(how=How.CSS, using="div[class$='has-error']>div>small[data-bv-result='VALID']") WebElement allFieldsValidationErrorMessages_Valid; 

    @FindBy(css="div[class$='has-error']>div>small[data-bv-result='INVALID']") public List<WebElement> allFieldsValidationErrorMessages_Invalid; 

public void enterInputFormDetails() 
{ 
    inputformlink.click(); 
    inputFormSubmit.click(); 
    firstName.sendKeys("FirstName"); 
    lastName.sendKeys("LastName"); 
    eMail.sendKeys("[email protected]"); 
    phoneNumber.sendKeys("9008001242"); 
    address.sendKeys("1234, 1st street"); 
    city.sendKeys("City"); 

    //State Selector 
    Select oneState= new Select(state); 
    oneState.selectByIndex(3); 

    zipCode.sendKeys("12345"); 
    projDescription.sendKeys("This is Project Description"); 
    sendButton.click(); 

     APP_LOGS.info("*****************InputFormSubmit Button is clicked*****************"); 

    } 

现在在我的测试用例即InputFormSubmitPageTest我能够初始化webdriver的......但在这里是问题..我的NE xt测试案例..如果我通过相同的行即WebDriver驱动程序= TestBase.initialization();浏览器正在重新初始化..我绝对想避免..但不知道如何执行我使用TestNG.xml运行顺序执行

public class InputFormSubmitPageTest { //My First TestCase 

    @Test 
    public void validatingFieldsData() throws Throwable 
    { 
     WebDriver driver=TestBase.initialization(); // this is where i am starting browser 

     InputFormSubmitPage formSubmit=PageFactory.initElements(driver, InputFormSubmitPage.class);  
     formSubmit.inputFormLaunch(); 
     formSubmit.inputFormSubmitInValidValidations(); 
     formSubmit.enterInputFormDetails(); 
    } 

} 

我的第二个测试用例即AjaxFormSubmitPageTest

public class AjaxFormSubmitPageTest { //My Send TestCase 

    @Test 
    public static void validatingFieldsData() throws Throwable 
    { 
     WebDriver driver=TestBase.initialization(); // this is where i am starting browser 

     AjaxFormSubmitPage formSubmit=PageFactory.initElements(driver, AjaxFormSubmitPage.class);  
     formSubmit.inputFormLaunch(); 
     formSubmit.inputFormSubmitInValidValidations(); 
     formSubmit.enterInputFormDetails();   
    }  
} 

我的testng.xml包含以下条目...

class name="testcases.InputFormSubmitPageTest" 
class name="testcase.AjaxFormSubmitPageTest" 
+0

解决。使用单例类 - https://www.tutorialspoint.com/java/java_using_singleton.htm引用此页欲了解更多详情 –

+0

不知道辛格尔顿如何在这里帮助。 – bbk

+0

当你说driver.get(url)时,让webDriver对象方法为singleton.so,它会加载新的url而不是启动新的驱动程序 –

回答

1

如何创建@BeforeCl屁股并做你的驱动程序初始化那里 喜欢的东西:

@BeforeClass 
     public static void before() { 
    WebDriver driver=TestBase.initialization(); 
    } 

这将只执行一次,并会做初始化。

如果你只担心执行顺序,你将不得不做出改变2:1,在你的testng.xml文件中,你将不得不补充:

测试名称=“测试” 保存-order =“true” 这将确保testng.xml文件中提到的测试类的执行顺序。按照此链接查看更多细节http://www.seleniumeasy.com/testng-tutorials/preserve-order-in-testng

如果你想确保一个类中的优先顺序,你将不得不做这样的事情:

@Test(priority=1) public void Test1() {} 

@Test(priority=2) public void Test2() {} 

@Test(priority=3) public void Test3() {} 

优先鼓励执行顺序,但并不保证以前的优先级级别已完成。 test3可以在test2完成之前启动。如果需要保证,那么声明一个依赖关系。

与声明依赖关系的解决方案不同,即使一个测试失败,也会执行使用优先级的测试。依赖关系的这个问题可以用@Test(... alwaysRun = true ...)根据http://testng.org/doc/documentation-main.html#annotations

+0

非常感谢@anshulGupta为你的时间和解决方案工作 – bbk

相关问题