近在学习testNG+selenium+java自动化测试工具,但过程中遇到了如下问题,现在已经基本解决,主要是换了一下思路。写此日志以便日后找出更好的解决方法。
问题:
在执行测试过程中要执行如下用例:
1.打开网站首页(如:m.test.com)
2.在首页的搜索框中输入某个关键词,如:鞋子
3.检查打开的鞋子商品列表显示的数据列表是否为每页10条。
以上这个步骤仅仅是众多用例中的一个,但是对于第一步的这个动作则是众多测试用例中都要首先进行操作的步骤。我想要把这个步骤独立出来,做成一个方法,让这个方法可以返回当前打开的网页的WebDriver于是我想到了testNG中的dataProvider但是经过N次的测试,此方法都不可以返回WebDriver这种对象类型。
为什么要将这个打开网站的方法参数化:
1.因为多数用例都要使用这个步骤
2.如果重新定义一个WebDriver,则会重新在新的WebDriver中找页面对象,但是页面对象却存在于第一次打开的页面中。
原本的代码如下:
@DataProvider(name="driver")
public static WebDriver BaseTest(){
WebDriver driver=new FirefoxDriver();
driver.get("http://m.test.com");
return driver;
}
然后在需要这个webdriver的地方进行调用如下:
@Test(dataprovider="driver")
public openpage(WebDriver driver){
//省略}
语法上没有问题,但是总是会报错,大意如:dataprovider只能返回如Object[][]类型的对象。
调了两天还是不行(由于初学,实在是笨)
后的解决方法是,在另一个类中写一个方法,每次要用到这个driver时去调用这个方法,这个类中包含众多方法(如获取随机数,查找某个页面对象…………)后的代码如下:
public static FirefoxDriver OpenWap(String url){
FirefoxDriver driver=new FirefoxDriver();
driver.get(url);
return driver;
}
在另一个类中的调用代码如下:
private static WebDriver driver;
String url="http://m.vancl.com/user/switch/1";
driver=Utils.OpenWap(url);
于是整个调试顺利通过。整体的调用代码如下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import org.testng.internal.thread.TestNGThread;
import web.Util.Utils;
public class ProductList {
private static WebDriver driver;
//打开wap站首页
@Test
public void SearchWordClick() throws InterruptedException {
String url="http://m.vancl.com/user/switch/1";
driver=Utils.OpenWap(url);
int i = Utils.getRandom(3);
// 搜索关键词的xpath string
String KeyWordString = "//div[@class='nav']/a[" + i + "]";
WebElement KeywordLink = Utils.getElement(KeyWordString, driver);
KeywordLink.click();
TestNGThread.sleep(10000);
}
@Test(dependsOnMethods="SearchWordClick")
public void CheckSearchWordList() throws InterruptedException{
/**
* 检查搜索列表页是否正确加载
**/
try {
WebElement cntchk = driver.findElement(By
.xpath("//div[@class='searchorder']/a[1]"));
String chkstr = cntchk.getText().trim();
if (chkstr.equals("属性导航") || chkstr.equals("分类导航")) {
System.out.println("找到了验证的标记:" + chkstr);
System.out.print("已成功加载商品列表页");
}
} catch (Exception e) {
System.out.println("商品列表页加载失败" + e.getMessage());
}
TestNGThread.sleep(3000);
driver.close();
}
}
初学testNG,一边翻资料,一边看API,一边调试,一边百度。真是头大,但是慢慢来吧,点点积累谁让咱起步晚呢~~~如果有高手有好的解决方法,还请告知我,非常感激。