我尝试自动化方案,其中,我需要导航到网站(加载时间超过30秒)然后输入登录详细信息(再次加载需要40秒),然后选择帐户标签,然后需要修改帐户页面中的一些细节。
说,我做了三节课:
@BeforeSuite
) 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类。我尝试使用全部三个thread
,implicitWait
,explicitWait
。所有人都抛出相同的错误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)
密码和退出相同。
希望你了解我的情况。提前致谢
答案 0 :(得分:0)
您分享的代码段没有任何暗示它能够抛出NullPointerException
的指针,因为您正在初始化static
WebDriver
引用你的@BeforeSuite
。因此,即使您的@BeforeSuite
只运行一次(主要用于第一类,即pack.Browser
),您仍然是安全的,因为它的静态数据成员和静态数据成员在所有实例之间共享你的测试类(这是许多问题的处方)。
所以你需要分享完整的代码,运行时抛出NullPointerException
和堆栈跟踪。
您的代码存在一些问题。
@BeforeSuite
方法为您的班级初始化您的webdriver参考。当您在NullPointerException
标记中包含两个或更多<test>
个引用时,这肯定会导致您的类<class>
,因为第二个<class>
@BeforeSuite
没有被执行。您应该将此注释更改为使用@BeforeClass
。如果您使用@BeforeMethod
,则需要切换到ThreadLocal
变体,否则您的并发执行将成为问题。static
WebDriver
。静态数据成员在类的多个实例之间共享。因此,如果您以后决定要使用TestNG并行运行两个或更多<class>
,那么您将真正看到竞争条件,因为所有测试都将尝试在同一个浏览器实例上运行。您可能希望从数据成员中删除static
属性。更新(基于更新的问题)
在您的课程中,Password
,Signout
和Username
您已声明了一个webdriver实例public WebDriver driver;
这会导致基类driver
中的Browser
数据成员被遮蔽。要添加到其中,您的班级Password
,Signout
和Username
中的数据成员由于投影行为而无法初始化。
这解释了NullPointerException
。请在类Password
,Signout
和Username
中删除此数据成员声明。这应解决您的NullPointerException
。但从长远来看,请解决上面提到的两个方面。