在TestNG

时间:2017-10-12 04:34:21

标签: xml eclipse testng testng-eclipse

我尝试自动化方案,其中,我需要导航到网站(加载时间超过30秒)然后输入登录详细信息(再次加载需要40秒),然后选择帐户标签,然后需要修改帐户页面中的一些细节。

说,我做了三节课:

  • Class1-Browser(有@BeforeSuite
  • 等级2-登录
  • Class3的-AccountChange
 public class Browser{

    public static WebDriver driver;

    @BeforeSuite
    public static void setUp(){
        System.setProperty("webdriver.chrome.driver", "C://chromedriver.exe");
        driver = new ChromeDriver(); 
        driver.get("site_name");
    }

    @AfterSuite
    public static void close(){
        driver.close();
    }
}

我需要将wait()用于Login类。我尝试使用全部三个threadimplicitWaitexplicitWait。所有人都抛出相同的错误NullPointerException

public class Login extends Browser {

    @Test
    public void login(){
        //Thread.sleep(5000);
        WebDriverWait wait=new WebDriverWait(driver,50);
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("   ")));
        //driver.manage().timeouts().implicitlyWait(90,TimeUnit.SECONDS);
        driver.findElement(By.xpath("    ")).sendKeys("Uname");
        driver.findElement(By.xpath("    ")).sendKeys("Pwd");
    }   
}

我也需要等待下面的课程。

public class AccountChange extends Browser {

    @Test
    public void change(){
        <<my code goes here>>
    }
}       

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="Regression Test">
        <classes>
            <class name="pack.Browser" />
            <class name="pack.Login" />
            <class name="pack.AccountChange" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

请帮忙。

更新 我用gmail解释了我的标准。

使用@BeforeSuite打开浏览器

public class Browser {
    public WebDriver driver;
    @BeforeSuite
    public void open(){
        System.setProperty("webdriver.chrome.driver", "C:/Users/rjayavel/Documents/Selenium/chromedriver_win32/chromedriver.exe");
        driver=new ChromeDriver();
        driver.get("http:\\gmail.com");
    }
}

然后使用两个类输入用户名和密码。

public class Username {
    public WebDriver driver;
    public WebDriverWait wait;
    @Test
    public void uname(){
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='identifierId']")));
        driver.findElement(By.xpath("//*[@id='identifierId']")).sendKeys("my_username");
        driver.findElement(By.xpath("//*[@id='identifierNext']/content/span")).click();
    }
}
public class Password {
    public WebDriver driver;
    @Test
    public void pwd(){
        driver.findElement(By.xpath("//*[@id='password']/div[1]/div/div[1]/input")).sendKeys("my_password");
        driver.findElement(By.xpath("//*[@id='passwordNext']/content/span")).click();
    }
}

然后使用@AfterSuite退出

public class Signout {
    public WebDriver driver;
    @AfterSuite
    public void signout(){
        driver.findElement(By.xpath("//*[@id='gb']/div[1]/div[1]/div[2]/div[5]/div[1]/a/span")).click();
        driver.findElement(By.xpath("//*[@id='gb_71']")).click();
    }
}

我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="GMAIL">
    <test name="Login">
        <classes>
            <class name="gmail.Browserr"/>
            <class name="gmail.Username"/>
            <class name="gmail.Password"/>
            <class name="gmail.Signout"/>
        </classes>
    </test>
</suite>

这里是上面的例子。首先应该运行@BeforeSuite然后应该等待用户名定位器可见,然后输入用户名,然后输入密码和注销功能。但实际发生的是在执行@BeforeSuite时,用户名和密码并行执行并在等待命令上抛出NullPointerException

错误如下:

java.lang.NullPointerException
at gmail.Username.uname(Username.java.14)
at org.testng.remote.abstractremotetestng.run(AbstractResmoteTestNG.java.114)

密码和退出相同。

希望你了解我的情况。提前致谢

1 个答案:

答案 0 :(得分:0)

您分享的代码段没有任何暗示它能够抛出NullPointerException的指针,因为您正在初始化static WebDriver引用你的@BeforeSuite。因此,即使您的@BeforeSuite只运行一次(主要用于第一类,即pack.Browser),您仍然是安全的,因为它的静态数据成员和静态数据成员在所有实例之间共享你的测试类(这是许多问题的处方)。

所以你需要分享完整的代码,运行时抛出NullPointerException和堆栈跟踪。

您的代码存在一些问题。

  1. 您正在通过@BeforeSuite方法为您的班级初始化您的webdriver参考。当您在NullPointerException标记中包含两个或更多<test>个引用时,这肯定会导致您的类<class>,因为第二个<class> @BeforeSuite没有被执行。您应该将此注释更改为使用@BeforeClass。如果您使用@BeforeMethod,则需要切换到ThreadLocal变体,否则您的并发执行将成为问题。
  2. 您有static WebDriver。静态数据成员在类的多个实例之间共享。因此,如果您以后决定要使用TestNG并行运行两个或更多<class>,那么您将真正看到竞争条件,因为所有测试都将尝试在同一个浏览器实例上运行。您可能希望从数据成员中删除static属性。
  3. 更新(基于更新的问题)

    在您的课程中,PasswordSignoutUsername您已声明了一个webdriver实例public WebDriver driver;

    这会导致基类driver中的Browser数据成员被遮蔽。要添加到其中,您的班级PasswordSignoutUsername中的数据成员由于投影行为而无法初始化。

    这解释了NullPointerException。请在类PasswordSignoutUsername中删除此数据成员声明。这应解决您的NullPointerException。但从长远来看,请解决上面提到的两个方面。