2016-10-04 100 views
0

我不想在每个测试用例中使用TestNG重复以下代码。请给个建议。 我一直propfis为全局变量,初始化它们openBrowser(),然后在其他方法使用,但我得到NullPointerExeption上的道具。如果我添加下面的行,那么我不明白。我不想在Java中重复代码硒

我只想加载一次属性文件并重新使用它。

Properties prop = new Properties(); 
FileInputStream fis = new 
FileInputStream("C:\\Users\\xxxxx\\URL.properties"); 
prop.load(fis); 

代码:

public class CallUrl { 
WebDriver driver; 
Properties prop ; 
FileInputStream fis;   
@BeforeTest 
public void openBrowser() throws IOException 
{ 
    Properties prop = new Properties(); 
    FileInputStream fis = new FileInputStream("C:\\Users\\xxxx\\URL.properties"); 
    prop.load(fis);    System.setProperty("webdriver.chrome.driver","C:\\Users\\xxxx\\chromedriver.exe"); 
     String browserType = prop.getProperty("Browser");  
    if (browserType.equals("Chrome")) 
     {    System.setProperty("webdriver.chrome.driver","C:\\Users\\Ashish\\Documents\\Selenium\\drivers\\chromedriver_win32\\chromedriver.exe"); 
      driver = new ChromeDriver(options); 
     } 
    else if(browserType.equals("FireFox")) 
    { 
     driver = new FirefoxDriver(); 
    }   
} 

@Test 
public void openURL() throws IOException 
{ 
    Properties prop = new Properties(); 
    FileInputStream fis = new FileInputStream("C:\\Users\\xxxxx\\URL.properties"); 
    prop.load(fis); 
     driver.get(prop.getProperty("URL")); 
     WebDriverWait myDynamicElement = new WebDriverWait(driver,30);   myDynamicElement.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='userName']"))); 
} 

@Test(dependsOnMethods={"openURL"}) 
public void loginToTours() throws InterruptedException, IOException 
{ 
    Properties prop = new Properties(); 
    FileInputStream fis = new FileInputStream("C:\\Users\\xxxxx\\URL.properties"); 
    prop.load(fis);   driver.findElement(By.name("userName")).sendKeys(prop.getProperty("login"));  driver.findElement(By.name("password")).sendKeys(prop.getProperty("password")); 
    driver.findElement(By.name("login")).click();  
}  
} 
+0

抽象基类? – chrylis

回答

1

您可以将它们移到BeforeClass将在类的所有测试之前只执行一次。我个人不喜欢启动浏览器的测试的想法,直接处理页面元素。我建议你实现页面对象模型 - 检查here

public class CallUrl { 
WebDriver driver; 
Properties prop; 

@BeforeClass 
public void loadProps(){ 
    prop = new Properties(); 
    FileInputStream fis = new FileInputStream("C:\\Users\\xxxx\\URL.properties"); 
    prop.load(fis); 
} 


@BeforeTest 
public void openBrowser() throws IOException { 
    System.setProperty("webdriver.chrome.driver", "C:\\Users\\xxxx\\chromedriver.exe"); 
    String browserType = prop.getProperty("Browser"); 
    if (browserType.equals("Chrome")) { 
    System.setProperty("webdriver.chrome.driver", "C:\\Users\\Ashish\\Documents\\Selenium\\drivers\\chromedriver_win32\\chromedriver.exe"); 
    driver = new ChromeDriver(options); 
    } else if (browserType.equals("FireFox")) { 
    driver = new FirefoxDriver(); 
    } 
} 

@Test 
public void openURL() throws IOException { 
    driver.get(prop.getProperty("URL")); 
    WebDriverWait myDynamicElement = new WebDriverWait(driver, 30); 
    myDynamicElement.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='userName']"))); 
} 

@Test(dependsOnMethods = { 
    "openURL" 
}) 
public void loginToTours() throws InterruptedException, IOException { 
    driver.findElement(By.name("userName")).sendKeys(prop.getProperty("login")); 
    driver.findElement(By.name("password")).sendKeys(prop.getProperty("password")); 
    driver.findElement(By.name("login")).click(); 
} 
} 
+0

。它工作,但是当我使用BeforeTest方法时,我得到了nullpointerException,而不是BeforeClass..why? BeforeClass有什么不同? – Tokci

+0

问题出在'Properties prop = new Properties();' - 你为其他方法不可用的方法创建一个局部变量。 – vins