selenium進階


一、切換

  1.window窗口切換

@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.切換到對話框

    對話框的辨別https://blog.csdn.net/huilan_same/article/details/52298460

    alert為瀏覽器彈出框,一般是用來確認某些操作、輸入簡單的text或用戶名、密碼等,根據瀏覽器的不同,彈出框的樣式也不一樣。這種彈窗是無法取到元素的,即alert是不屬於網頁DOM樹的。如從左到右,依次為alert\confirm\prompt

  

  div偽裝對話框,是通過網頁元素偽裝成對話框,這種對話框內容較多,不會隨瀏覽器而改變,在網頁中能獲取到元素。如下圖

  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 text

  測試鏈接: http://sahitest.com/demo/alertTest.htm

 

@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),dismiss

    測試鏈接:http://sahitest.com/demo/confirmTest.htm

 

@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();} //返回最外層

 

 

 

二、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());
    }

 

 

 
        

三、執行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");  

四、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']")));
}

 

五、網頁截圖

  需要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"));
     
 }

 

  結果:

 

  

六、上傳下載

  沒講

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

七、顯式等待、隱式等待

  等待的方式有三種:顯示等待、隱私等待、線程休眠

  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)

八、數據驅動

  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());
        }
    }
}

 

 

 

 

 
        

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM