1. 程式人生 > >java,利用Selenium調用瀏覽器,動態模擬瀏覽器事件,動態獲取頁面信息

java,利用Selenium調用瀏覽器,動態模擬瀏覽器事件,動態獲取頁面信息

cti 模擬 中間 bar 新建 getopt 復制 鼠標 mis

1、環境搭建

jdk1.6版本:selenium 2.4版本。

jdk1.8版本:selenium3.14版本。

(1)selenium的jar包下載:

地址:http://selenium-release.storage.googleapis.com/index.html

需要用:selenium-server-standalone-3.9.1.jar(需要在cmd下安裝,java -jar ***),selenium-java-2.40.0.jar,selenium-java-2.40.0-srcs.jar還有它的libs。

(2)webDriver下載:

網址: http://chromedriver.storage.googleapis.com/index.html

或者 http://npm.taobao.org/mirrors/chromedriver/

註意:webDriver必須與瀏覽器版本相對應,否則會出現問題

2、程序代碼示例

        //固定時間等待:driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        //設定最大等待時間,一旦標簽存在即可返回:wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".abc")))
        WebDriver driver = new
ChromeDriver(); // 新建一個WebDriver 的對象,但是new 的是谷歌的驅動 driver.get(url); // 打開指定的網站 try { Thread.sleep(60000);// 60秒 driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); } catch (Exception e) { e.printStackTrace(); }
//定位層級元素 WebElement e = driver.findElement(By.cssSelector(".animation-toggle")); e.click(); //等待加載完頁面 try { Thread.sleep(60000);// 60秒 driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);//等待界面加載完 } catch (Exception e2) { e2.printStackTrace(); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Date d=new Date(); List<WebElement> list = driver.findElements(By.cssSelector("img.frame"));//img標簽,class為frame int i=-1; for (WebElement el : list) { String img_url=el.getAttribute("src"); //System.out.println(img_url); String time = sdf.format(d.getTime()+i*24*60*60*1000); loadPage(img_url,type,time); i=i+1; } driver.quit();// 退出瀏覽器

3、元素定位

(1)根據tagName

  driver.findElement(By.cssSelector("input")

(2)根據ID

  driver.findElement(By.cssSelector("input#username"));html標簽和#id

  driver.findElement(By.cssSelector("#username"));只是#id

(3)根據className

  單一class:driver.findElement(By.cssSelector(".username"));.class

  復合class:driver.findElement(By.cssSelector(".username.**.***"));.classA.classB

(4)根據元素屬性

  1)精準匹配:

    [A] driver.findElement(By.cssSelector("input[name=username]"));屬性名=屬性值,id,class,等都可寫成這種形式

[B] driver.findElement(By.cssSelector("img[alt]"));存在屬性。例如img元素存在alt屬性

    [C] driver.findElement(By.cssSelector("input[type=‘submit‘][value=‘Login‘]"));多屬性

  2)模糊匹配:(正則表達式匹配屬性)

    [A] ^= driver.findElement(By.cssSelector(Input[id ^=‘ctrl‘]));匹配到id頭部 如ctrl_12

    [B] $= driver.findElement(By.cssSelector(Input[id $=‘ctrl‘]));匹配到id尾部 如a_ctrl

    [C] *= driver.findElement(By.cssSelector(Input[id *= ‘ctrl‘]));匹配到id中間如1_ctrl_12

    更多正則匹配原則請查看CSS3 選擇器——屬性選擇器 http://www.w3cplus.com/css3/attribute-selectors

(5)查詢子元素

技術分享圖片 技術分享圖片
<form id="form" class="fm" name="f">
  <span id="s_kw_wrap" class="bg s_ipt_wr quickdelete-wrap">
    <input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd">
  </span>
  <span id="s_btn_wr" class="btn_wr s_btn_wr bg">
    <input id="su" class="btn self-btn bg s_btn" type="submit" value="百度一下">
  </span>
</form>
技術分享圖片

以上代碼是百度首頁搜索輸入框和按鈕的html,下面講解以此為例

  1)子元素 A>B

    WebElement input= driver.findElement(By.cssSelector("form>span>input"));//搜索輸入框

  2)後代元素 A空格B

    WebElement input= driver.findElement(By.cssSelector("form input"));//搜索輸入框

  3)第一個後代元素  :first-child

    WebElement span= driver.findElemet(By.cssSelector("form :first-child"));//冒號前有空格,定位到form下所有級別的第一個子元素

      可定位到三個元素:<span id="s_kw_wrap".../> <input id="kw"..../> <input id="su"........./>

    WebElement span= driver.findElemet(By.cssSelector("form input:first-child"));//冒號前無空格,定位到form下所有級別的第一個input元素

      可定位到兩個元素:<input id="kw"..../> <input id="su"........./>

    WebElement span= driver.findElemet(By.cssSelector("form>span:first-child"));//冒號前無空格,定位到form直接子元素中的第一個span元素

      可定位到一個元素:<span id="s_kw_wrap".../>

  4)最後一個子元素 :last-child [類同:first-child]

    WebElement userName = driver.findEleme(By.cssSelector("form :last-child"));//冒號前有空格,定位到form下所有級別的第一個子元素

  5)第2個子元素 :nth-child(N) [類同:first-child]

    WebElement userName = driver.findElemet(By.cssSelector("form#form :nth-child(2)"));//冒號前有空格,定位到form下所有級別的第二個子元素

(6)查詢兄弟元素

  driver.findElement(By.cssSelector("form#form span+span")); 定位到a 再定位到和它相鄰的b

4、頁面響應等待問題

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);不靠譜
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".abc")));不實用
Thread.sleep(60000);比較實用

最後,在附贈一個列子:
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;



public class Test1 {

    public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", "D:\\webDriver\\chromedriver.exe");// chromedriver服務地址
        WebDriver driver = new ChromeDriver(); // 新建一個WebDriver 的對象,但是new 的是谷歌的驅動
        String url = "http://www.baidu.com";
        driver.get(url); // 打開指定的網站
        
        //driver.navigate().to(url); // 打開指定的網站        
        
        /*
         * 
         * driver.findElement(By.id("kw")).sendKeys(new String[] { "hello" });//
         * 找到kw元素的id,然後輸入hello driver.findElement(By.id("su")).click(); // 點擊按扭
         */
        try {
            /**
             * WebDriver自帶了一個智能等待的方法。 dr.manage().timeouts().implicitlyWait(arg0, arg1);
             * Arg0:等待的時間長度,int 類型 ; Arg1:等待時間的單位 TimeUnit.SECONDS 一般用秒作為單位。
             */
            driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //獲取當前瀏覽器的信息
        System.out.println("Title:" + driver.getTitle());
        System.out.println("currentUrl:" + driver.getCurrentUrl());

        //執行js腳本
        String jString = "alert(‘122‘)";
        ((JavascriptExecutor) driver).executeScript(jString);

        //獲取單個元素
        WebElement element = driver.findElement(By.id("wrapper"));
        System.out.println(element.getAttribute("class"));

        //獲取多個元素
        List<WebElement> elList = driver.findElements(By.tagName("input"));
        for (WebElement e : elList) {
            System.out.println("獲取多個元素:"+e.getAttribute("name"));
        }
        
        //定位層級元素
        WebElement e = driver.findElement(By.cssSelector("#qrcode-item qrcode-item-1"));
        List<WebElement> list = e.findElements(By.tagName("div"));
        for (WebElement e1 : list) {
            System.out.println("定位層級元素:"+e1.getAttribute("class"));
        }
        
        
        
        //獲取當前的窗口
        String currentWindow = driver.getWindowHandle();
        
        //獲取所有的窗口
        Set<String>  handles = driver.getWindowHandles();
        
        //遍歷窗口
        Iterator<String> iterator = handles.iterator();
        while (iterator.hasNext()) {
            if (currentWindow == iterator.next())
                continue;
            //跳轉到彈出的窗口
            WebDriver driver2 = driver.switchTo().window(iterator.next());
            driver2.getTitle();
            
        }
        
        
        //處理彈出框
        Alert alert = driver.switchTo().alert();
        alert.getText();
        alert.dismiss();//相當於點擊取消
        
        
        Alert confirm = driver.switchTo().alert();
        confirm.getText();
        confirm.accept();//相當於點擊確認
        
        
        Alert prompt = driver.switchTo().alert();
        prompt.getText();
        prompt.accept();
        prompt.sendKeys("測試1");//輸入值
        
        //處理下拉列表
        Select select = new Select(driver.findElement(By.id("select")));
        select.selectByIndex(1);
        select.selectByValue("西安");
        select.selectByVisibleText("鹹陽");
        //獲取下拉框的全部選項
        List<WebElement> list2 = select.getOptions();
        for (WebElement webElement : list2) {
            webElement.click();//點擊下拉框
        }
        
        //處理cookie
        //添加一個cookie
        Cookie cookie = new Cookie("COOKIE", "NAME","D://COOKIES");
        driver.manage().addCookie(cookie);
        
        //獲取cookies
        Set<Cookie> set = driver.manage().getCookies();
        Iterator<Cookie> iterator2 = set.iterator();
        while (iterator2.hasNext()) {
            Cookie c = iterator2.next();
            c.getName();
            c.getValue();
            c.getPath();
            
        }
        
        driver.manage().deleteAllCookies();
        driver.manage().deleteCookie(cookie);
        driver.manage().deleteCookieNamed("COOKIE");
        
        
        //等待加載完頁面
        try {
            driver.manage().timeouts().wait(1);
            driver.manage().timeouts().implicitlyWait(1,TimeUnit.SECONDS);//等待界面加載完
        } catch (InterruptedException e2) {
        
            e2.printStackTrace();
        }
        
        //模擬鼠標和鍵盤操作
        Actions action = new Actions(driver); 
        action.click();
        action.dragAndDrop(element, e);
        action.sendKeys(element,"12222").perform();
        action.click(element);
        action.keyDown(currentWindow);
        
        
    
        
        // driver.quit();// 退出瀏覽器

        /**
         * dr.quit()和dr.close()都可以退出瀏覽器,簡單的說一下兩者的區別:第一個close,
         * 如果打開了多個頁面是關不幹凈的,它只關閉當前的一個頁面。第二個quit,
         * 是退出了所有Webdriver所有的窗口,退的非常幹凈,所以推薦使用quit最為一個case退出的方法。
         */

    }

}



java,利用Selenium調用瀏覽器,動態模擬瀏覽器事件,動態獲取頁面信息