为什么80%的码农都做不了架构师?>>>
因为页面内容有很多页,需要切换页数,但是切换跳转到第二页的时候,页面首先会自动刷新,导致出现如下异常:Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
//获取当前页面的table内容
static int count = 0;
public static List getPageTableContent(WebDriver driver,WebElement table,String refreshElement ){
//获取当前页面的table
//把下面这行代码的注释去掉即可
// table= driver.findElement(By.xpath(refreshElement));
List rows = table.findElements(By.tagName("tr"));//根据行标签,获取所有行对象
//String[] tableTitle = {"编号","配置名称","首页返回按钮","首页banner显示","极简尾页",""};
ArrayList tableContent = new ArrayList<>();
for(WebElement row:rows){//从所有行中遍历每一行
List col = row.findElements(By.tagName("td"));//一行中,所有列标签,
for(WebElement cell:col){//一行中,所有的列(也就是单元格)
String content = cell.getText();//每个单元格的内容
tableContent.add(content);
//System.out.println(content + "...content");
//System.out.println(driver.findElement(By.xpath("//td[contains(text(),'可以')]")).getText() + "...findElement");
}
}
return tableContent;
}
//获取总页数
public static int getPageAllNo(WebDriver driver){
//获取总页数
String pageCountSumStr = driver.findElement(
By.xpath("//*[@id='product_mgt_wrap']/div/div[2]/div[3]/table/tbody/tr/td[8]/span")).getText();
int pageCountSum = Integer.parseInt(pageCountSumStr.substring(3));
return pageCountSum;
}
//获取当前页数
public static int getCurrentPageNo(WebDriver driver){
String pageCountSumStr = driver.findElement(
By.xpath("//*[@id='product_mgt_wrap']/div/div[2]/div[3]/table/tbody/tr/td[8]/span")).getText();
//获取当前页面页数
String pageSource = driver.getPageSource();//获取当前页的源文件
String pageElement = "pagination-num\" type=\"text\" value=\"";//在源文件中查找含有该字段的位置
int pageIndex = pageSource.indexOf(pageElement);//通过上面的字段位置,定位文本框中的当前页数
//通过定位出来的位置,获取文本框中的值
}
//根据表格单元个内容定位单元格所在行
/**
* @author:苏一叶 email:[email protected]
* 1.进来先获取页面的总页数
* 2.如果总页数大于1
* 3.把每一条记录所有字段和记录所在的当前页数存入json中,表头为Key,值为Value。
* #3.把每一条记录中除编号外的其他字段和记录所在的当前页数存入json中,编号作为Key,其他已经存入json作为Value存入HashMap中。
* 4.传入需要定位的字符串,根据字符在json中查找对应的页数,把所有含有该字符的记录存到
* @throws InterruptedException
*/
public static void getRangeFromRows(WebDriver driver,String str) throws InterruptedException{
int pageCountSum = getPageAllNo(driver);//获取总页数
int currentPageCount = getCurrentPageNo(driver);//获取当前页数
//需要定位元素的xpath
String strContent = "//*[contains(text(),'" + str + "')]";
//获取当前页面的table
String refreshElement = "//*[@id='product_mgt_wrap']/div[1]/div[2]/div[2]/div[2]/div[2]/table";
WebElement table= driver.findElement(By.xpath(refreshElement));
if(pageCountSum == 1){
ArrayList tableContent = (ArrayList)getPageTableContent(driver,table,refreshElement);
for(String content:tableContent){
if(content.contains(str)){//若包含需要查找定位的关键字str
driver.findElement(By.xpath(strContent)).click();
}
}
}else{//页面总数大于1的时候
boolean flag = false;//设置一个跳出的标志位
for(int i=0;i tableContent = (ArrayList)getPageTableContent(driver,table,refreshElement);
for(String content:tableContent){
if(content.contains(str)){//若包含需要查找定位的关键字str
driver.findElement(By.xpath(strContent)).click();
flag = true;//若找到,即跳转出循环
break;//退出该循环体
}
}
Thread.sleep(1000);
currentPageCount += 1;//设置页数为2,页数大于1,逻辑转到else下面的代码块
}else{
//点击下一页的按钮,页面跳转到下一页,从第1页跳转到第2页
driver.findElement(By.xpath("//*[@id='product_mgt_wrap']/div/div[2]/div[3]/table/tbody/tr/td[10]/a/span/span[2]")).click();
Thread.sleep(1500);
//从第2页开始,每翻一页,都进行查找定位
for(int n=2;n<=pageCountSum&&!flag;n++){
ArrayList tableContent = (ArrayList)getPageTableContent(driver,table);
//点击下一页按钮
driver.findElement(By.xpath("//*[@id='product_mgt_wrap']/div/div[2]/div[3]/table/tbody/tr/td[10]/a/span/span[2]")).click();
Thread.sleep(1000);
currentPageCount = getCurrentPageNo(driver);//获取跳转后的页数
for(String content:tableContent){
if(content.contains(str)){//若包含需要查找定位的关键字str
driver.findElement(By.xpath(strContent)).click();
flag = true;//找到定位跳转到flag标志位
}
}
/*//获取所有页面的内容
tableContentAll.addAll((ArrayList)getPageTableContent(driver,table,refreshElement));*/
}
}
}
Thread.sleep(1000);
}
}
参考自:
http://www.cnblogs.com/fengpingfan/p/4583325.html
http://stackoverflow.com/questions/28066135/org-openqa-selenium-staleelementreferenceexception-stale-element-reference-ele