selenium进阶

1、切换css

  1.window窗口切换html

@Test public void test3(){ System.out.println(driver.getWindowHandle()); String oldHandle = driver.getWindowHandle(); //使用javaScript打开一个新标签页
    JavascriptExecutor oJavaScriptExecute =(JavascriptExecutor)driver; oJavaScriptExecute.executeScript("window.open();"); System.out.println("there are "+driver.getWindowHandles().size()+"windows"); for(String handle:driver.getWindowHandles()){ System.out.println(handle); if (! handle.equals(oldHandle)){ //新标签页打开http://www.testerhome.com
 driver.switchTo().window(handle); driver.get("http://www.testerhome.com"); break; } } driver.close(); //切换回第一个的标签页,不然handle依然停留在已关闭的标签页。针对不存在的标签操做,会报NoSuchWindowException的异常。如图2
 driver.switchTo().window(oldHandle); }

 


结果:

不切换回原有标签页

 

 
 

  2.切换到对话框java

    对话框的辨别https://blog.csdn.net/huilan_same/article/details/52298460git

    alert为浏览器弹出框,通常是用来确认某些操做、输入简单的text或用户名、密码等,根据浏览器的不一样,弹出框的样式也不同。这种弹窗是没法取到元素的,即alert是不属于网页DOM树的。如从左到右,依次为alert\confirm\promptgithub

  

  div假装对话框,是经过网页元素假装成对话框,这种对话框内容较多,不会随浏览器而改变,在网页中能获取到元素。以下图web

  driver.switchTo().alert().accept(); //等同于点击确认或OK
  driver.switchTo().alert().dismiss(); //等同于点击取消或cancel
  driver.switchTo().alert().getText(); //对有信息显示的alert框,获取alert文本内容
  driver.switchTo().alert().sendKeys("Hello world"); //对有提交需求的文本框发送文本

   示例1:switch_to.alert  accept textchrome

  测试连接: http://sahitest.com/demo/alertTest.htmapache

 

@Test public void test4() throws InterruptedException{ driver.get("http://sahitest.com/demo/alertTest.htm"); driver.findElement(By.xpath("//input[@name='b1']")).click(); Thread.sleep(2000); driver.switchTo().alert().accept(); Thread.sleep(2000); driver.findElement(By.xpath("//input[@name='b2']")).click(); Thread.sleep(2000); System.out.println(driver.switchTo().alert().getText()); Thread.sleep(2000); driver.switchTo().alert().accept(); driver.findElement(By.xpath("//input[@name='b3']")).click(); Thread.sleep(2000); driver.switchTo().alert().accept();}

 

     示例2:Alert(driver),dismisswindows

    测试连接:http://sahitest.com/demo/confirmTest.htmapi

 

@Test public void test4() throws InterruptedException{ driver.get("http://sahitest.com/demo/confirmTest.htm"); driver.findElement(By.xpath("//input[@name='b1']")).click(); System.out.println(driver.switchTo().alert().getText()); Thread.sleep(1000); driver.switchTo().alert().dismiss(); }

 


    示例3: switch_to.alert,send_keys(keysToSend) 
    测试连接:http://sahitest.com/demo/promptTest.htm
@Test public void test4() throws InterruptedException{ driver.get("http://sahitest.com/demo/promptTest.htm"); driver.findElement(By.xpath("//input[@name='b1']")).click(); driver.switchTo().alert().sendKeys("Hello world"); Thread.sleep(1000); driver.switchTo().alert().accept();}

 

问题:汽车之家的弹窗,是什么类型

  3.切换到iFrame/Frame

   web应用中常常会遇到frame/iframe表单嵌套页面的应用,web driver只能在一个页面对元素进行识别与定位,此时须要经过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。driver.switchTo().defaultContent()跳回最外层的页面。driver.switchTo().parentFrame();返回上一级页面

 

@Test public void frame() throws InterruptedException{ driver.get("http://sahitest.com/demo/framesTest.htm"); driver.switchTo().frame("top");  //根据惟一的标示,如id,name进入frame
    WebElement shadow=driver.findElement(By.xpath("//a[@href='shadowRoot.html']")); System.out.println(shadow.getText()); driver.switchTo().parentFrame(); //返回上一层 //driver.switchTo().frame("/html/frameset/frame[2]")
    WebElement show2 = driver.findElement(By.xpath("/html/frameset/frame[2]")); //先找到元素,再进入表单
 driver.switchTo().frame(show2); System.out.println(driver.findElement(By.xpath("//a[@href=\"selectTest.htm\"]")).getText()); driver.switchTo().defaultContent();} //返回最外层

 

 

 

2、cookie处理

  有时咱们须要验证浏览器中cookie是否正确,由于基于真是cookie的测试是没法经过白盒和集成测试的。Web Driver提供了操做cookie的相关方法,能够读取、添加和删除cookie信息。

  1.获取cookie

    1.1获取全部的cookie

@Test public void cookieTest() throws InterruptedException{ driver.get("http://www.baidu.com"); System.out.println(driver.manage().getCookies()); } //获取的cookie为一个字典

 

    1.2 对cookie进行迭代

for(Cookie cookie:driver.manage().getCookies()){ System.out.print("name:"+cookie.getName()+"\t"); System.out.print("Domain:"+cookie.getDomain()+"\t"); System.out.print("Expiry:"+cookie.getExpiry()+"\t"); System.out.print("value:"+cookie.getValue()+"\t"); System.out.println("path:"+cookie.getPath()); }

 

 

    1.3 根据name获取某个cookie

 @Test public void cookieTest() throws InterruptedException{ driver.get("http://www.autohome.com"); Cookie cookie = driver.manage().getCookieNamed("area"); System.out.println(cookie); }

 

 
 

  2.添加cookie

    Cookie cookie = new Cookie("","","",null)

    driver.manage().addCookie(cookie)

@Test public void cookieTest() throws InterruptedException{ driver.get("http://www.autohome.com"); //获取异常,打印日志
   try{ driver.switchTo().alert().dismiss(); } catch (Exception e){ Reporter.log("No alert displayed",true); } //添加cookie
   Cookie addcookie = new Cookie("zhangsan","lisi"); driver.manage().addCookie(addcookie); for(Cookie cookie:driver.manage().getCookies()){ System.out.print("name:"+cookie.getName()+"\t"); System.out.println("value:"+cookie.getValue()+"\t"); } }

 

 

 
 

  2.删除cookie

     2.1 删除单个cookie

 @Test public void cookieTest() throws InterruptedException{ driver.get("http://www.autohome.com"); Cookie cookie = driver.manage().getCookieNamed("area"); System.out.println(cookie.getName()+"\t"+cookie.getValue()); driver.manage().deleteCookie(cookie);    for(Cookie icookie:driver.manage().getCookies()){ System.out.println(icookie.getName()+"\t"+icookie.getValue()); }     //也能够直接按照name删除cookie
     driver.manage().deleteCookieNamed("ahpau"); }

 

    2.2 删除所有cookie

  

public void cookieTest() throws InterruptedException{ driver.get("http://www.autohome.com"); driver.manage().deleteAllCookies(); System.out.println(driver.manage().getCookies()); }

 

 

 
 

3、执行JavaScript

  document.getElementById("ibm-masthead").style.display='none';

  arguments[0].setAttribute('style',arguments[1]);

  arguments[0].scrollIntoView(true);

  document.documentElement.scrollTop=500

  document.getElementById(i).style.display ='block';   //获取当前页面里面id为i的标签,改变该标签的样式,使其满框显示。

  document.getElementById(i).style.display ='none';   //获取当前页面里面id为i的标签,改变该标签的样式,使其不显示。

  document.getElementById(i).style.display ='inline';   //获取当前页面里面id为i的标签,改变该标签的样式,使其显示。

 

@Test public void testJS(){ driver.get("http://www.baidu.com"); WebElement img = driver.findElement(By.xpath("//*[@id=\"cp\
    JavascriptExecutor js = (JavascriptExecutor)driver; js.executeScript("arguments[0].scrollIntoView(true);",img);}

 

  返回返回值  

  return arguments[0].getText();

  return documents.readyState;

  return window.innerWidth

  return document.documentElement.scrollTop

@Test public void testJS(){ driver.get("http://www.baidu.com"); JavascriptExecutor js = (JavascriptExecutor)driver; Object top=js.executeScript("return document.documentElement.scrollTop") ; System.out.println((long)top); }

 



执行JavaScript脚本http://lijingshou.iteye.com/blog/2018929

  1.初始化

    JavascriptExecutor js = (JavascriptExecutor)driver;

  2.直接传入Javascript代码

    js.executeScript("window.document.getElementById('su').click()";

  3.传入WebElement执行js脚本

   //百度首页点击百度一下

   WebElement element = driver.findElement(By.id("su"));  

   js.executeScript("arguments[0].click();", element);  

   //

   js.executeScript("arguments[0].onclick=function(){alert('This is my alert!');}", element)

   //指定的DIV就新增(修改)了 style {height: 1000px}的属性

   WebElement div = driver.findElemnt(By.id("myDiv"));  

   jse.executeScript("arguments[0].setAttribute('style', arguments[1])", div, "height: 1000px");  

4、actions

@Test public void cookieTest() throws InterruptedException{ driver.get("http://www.baidu.com"); Actions action = new Actions(driver); action.doubleClick(driver.findElement(By.xpath("//a[@name='tj_trmap']"))); }

 

5、网页截图

  须要jar包http://commons.apache.org/proper/commons-io/download_io.cgi

  下载Binaries文件

 

  若是下载commons-io-*.tar.gz,须要先解压tar -zxvf commons-io-*.tar.gz

  导入jar包

  file-project structure-添加-JARs and directories,添加解压后的目录

 

@Test public void screenshotTest() throws IOException { driver.get("http://www.baidu.com"); String screenpath = System.getProperty("user.dir")+"/src/screenshot/"; System.out.println(screenpath); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmmss"); String time = dateFormat.format(Calendar.getInstance().getTime()); File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile,new File(screenpath,time+".png")); //FileUtils.copyFile(srcFile,new File(screenpath,time+".png"));
 }

 

  结果:

 

  

6、上传下载

  没讲

https://seleniumhq.github.io/selenium/docs/api/java/overview-summary.html

7、显式等待、隐式等待

  等待的方式有三种:显示等待、隐私等待、线程休眠

  1. 显示等待 针对于某个元素的明确等待

  WebDriverWait wait = new WebDriverWait(driver,15);

  wait.unitl(ExpectedConditions.visibilityOfElementLocated(By.id("kw")));

@Test public void waitfor(){ driver.get("http://www.baidu.com"); driver.findElement(By.id("kw")).sendKeys("selenium"); driver.findElement(By.id("su")).click(); //显式等待,每500毫秒检查元素是否存在;超过30秒没有发现,就报异常
       By result = By.cssSelector("span.nums_text"); WebDriverWait wait = new WebDriverWait(driver,30); wait.until(ExpectedConditions.visibilityOfElementLocated(result)); String actureResult = driver.findElement(result).getText(); String expectResult="百度为您找到相关结果"; Assert.assertTrue(actureResult.contains(expectResult)); }

 

  2. 隐式等待 经过 必定的时长等待页面上某元素加载完成,默认设置为0。可设置为全局等待

   webDriver driver; 

   driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);

  3. 线程休眠

    Thread.sleep(5000)

8、数据驱动

  1. 根据二维数组输入内容

package testcase; import org.apache.commons.io.FileUtils; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.*; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.concurrent.TimeUnit; public class dataProvider { @DataProvider public static Object[][] getTestData(){ Object[][] o = new Object[2][1]; o[0][0] = "selenium"; o[1][0] = "appium"; return o; } @Test(dataProvider = "getTestData") public void seartchTest(String searchKey) throws IOException { String chromePath = System.getProperty("user.dir") + "/src/main/java/drivers/chromedriver"; String screenpath = System.getProperty("user.dir")+ "/src/screenshot/"; WebDriver driver ; System.setProperty("webdriver.chrome.driver", chromePath); driver=new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); driver.get("http://www.baidu.com"); driver.findElement(By.id("kw")).sendKeys(searchKey); driver.findElement(By.id("su")).click(); By result = By.cssSelector("span.nums_text"); Assert.assertTrue(driver.findElement(result).isDisplayed()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String time = dateFormat.format(Calendar.getInstance().getTime()); File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile,new File(screenpath,time+".png")); driver.close(); } }

 

  2. 从excel文件中导入数组

 

//须要把脚本转化为excel驱动的模式
import java.io.File; import java.io.FileInputStream; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; public class SeleniumWork1 { public static void main(String[] args){ try{ File src = new File("/Users/chenshanju/Desktop/testerhome/java.xlsx"); FileInputStream fis = new FileInputStream(src); @SuppressWarnings("resource") XSSFWorkbook wb = new XSSFWorkbook(fis); XSSFSheet sh1 = wb.getSheetAt(0); System.out.println(sh1.getRow(0).getCell(0).getStringCellValue()); System.out.println(sh1.getRow(3).getCell(1).getStringCellValue()); int rowInExcel = sh1.getPhysicalNumberOfRows(); int columnInExcel = sh1.getRow(0).getPhysicalNumberOfCells(); System.out.println(rowInExcel+"\t"+columnInExcel); String[][] obj = new String[rowInExcel][columnInExcel]; for(int row=0;row <rowInExcel;row++){ for(int col=0;col<columnInExcel;col++){ obj[row][col]=sh1.getRow(row).getCell(col).getStringCellValue(); System.out.println(obj[row][col]); } } }catch (Exception e){ System.out.println(e.getMessage()); } } }

 

相关文章
相关标签/搜索