java selenium webdriver實戰 應用小結

部分api

1.訪問網站

 driver.get("http://www.baidu.com");

或者

driver.navigate().to("http://www.baidu.com");

 

2.操作瀏覽器窗口

複製代碼
//聲明一個point對象,兩個150表示瀏覽器的位置相對於屏幕的左上角(0,0)的橫座標距離和縱座標距離 
Point point = new Point(150, 150);
//聲明dimension對象,兩個500表示瀏覽器窗口的長度和寬度
 Dimension dimension = new Dimension(500, 500);
//設定瀏覽器窗口的大小爲長500 寬500
 driver.manage().window().setSize(dimension);
//最大化瀏覽器
 driver.manage().window().maximize();
複製代碼

 

3.瀏覽器輸入值 和點擊

 driver.navigate().to("http://www.baidu.com");
 driver.findElement(By.id("kw")).clear();
driver.findElement(By.id("kw")).sendKeys("魔獸");
driver.findElement(By.id("su")).click();

 

4.操作多選的選擇列表

 

複製代碼
Select dropSelect = new Select(driver.findElement(By.name("fruit")));
//判斷頁面是否進行多選
 Assert.assertTrue(dropSelect.isMultiple());
 //使用選擇項索引選擇第三個選項
 dropSelect.selectByIndex(3);
 //根據value值選擇
 dropSelect.selectByValue("value");
  //根據選項文字選擇
  dropSelect.selectByVisibleText("蘋果");
  //取消所有選項的選中狀態
 dropSelect.deselectAll();
 //取消第三個的選中狀態
 dropSelect.deselectByIndex(3);
 //根據value值取消選擇
 dropSelect.deselectByValue("value");
 //根據選項文字取消選擇
 dropSelect.deselectByVisibleText("蘋果");
複製代碼

 

5.操作單選框

複製代碼
WebElement radioOption = driver.findElement(By.xpath("//input[@value='orange']"));
          if(!radioOption.isSelected()){
              radioOption.click();
          }
          List<WebElement> fruits = driver.findElements(By.name("fruit"));
          for(WebElement fruit : fruits){
              if(fruit.getAttribute("value").equals("watermelon")){
                  if(!fruit.isSelected()){
                      fruit.click();
                      Assert.assertTrue(fruit.isSelected());
                      break;
                  }
              }
          }
複製代碼

6.複選框同上

7.執行javascript腳本

JavascriptExecutor js = (JavascriptExecutor) driver;
//取消上傳input隱藏
js.executeScript("document.getElementById(\"file\").style=\"display: block;\"");
JavascriptExecutor js = (JavascriptExecutor) driver;
//返回搜索按鈕上的文字
String text = (String)js.executeScript("var button = document.getElementById(\"stb\");return button.value");

8.等待操作

設定查找頁面元素的最大等待時間,調用findElement方法的時候沒有能立即找到某個元素

,則程序會每隔一段時間後不斷的嘗試判斷頁面的DOM中是否出現被查找的元素,如果超過

設定的等待時長依舊沒有找到,則拋出NoSuchElementException

 

隱形等待

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

複製代碼
@BeforeClass
 public static void init() {
     System.out.println("init...");
     System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
     // 創建一個 ChromeDriver 的接口,用於連接 Chrome,
     //必須要有chromedriver.exe文件,selenium默認不能啓動chrome
     // 創建一個 Chrome 的瀏覽器實例
     driver = new ChromeDriver();
     //最大化瀏覽器
     driver.manage().window().maximize();
     //設置全局的隱形等待
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
 }
複製代碼


隱性等待的默認時長是0,一旦設置,這個隱試等待會在webdriver對象實例的整個生命週期起作用

 

顯示等待

顯示等待比隱式等待更節約測試腳本執行的時間,推薦使用顯示等待判斷頁面元素是否存在

使用ExpectedConditions類中自帶的方法,可以進行顯示等待的判斷

複製代碼
//頁面元素是否在頁面上可用和可被點擊
ExpectedConditions.elementToBeClickable(By locator);
//頁面元素是否處於被選中狀態
ExpectedConditions.elementToBeSelected(By locator);
//頁面元素在頁面是否存在
ExpectedConditions.presenceOfElementLocated(By locator);
//是否包含特定的文本
ExpectedConditions.textToBePresentInElement(locator, text)
//頁面元素值
ExpectedConditions.textToBePresentInElementValue(locator, text);
//標題
ExpectedConditions.titleContains(title);
複製代碼
// 等待元素可見且可被單擊
 wait.until(ExpectedConditions.elementToBeClickable(By.id(id)));

 

自定義的顯示等待

複製代碼
public static void sendKeysByXPath(WebDriver driver, String path, String key) {
        WebDriverWait wait = new WebDriverWait(driver, 10); // 最多等10秒
        WebElement element = wait.until(new ExpectedCondition<WebElement>() {
            @Override
            public WebElement apply(WebDriver d) {
                return d.findElement(By.xpath(path));
            }
        });
        highLightElement(driver,element);
        element.clear();
        element.sendKeys(key);
    }
複製代碼

注意一點:如果是該元素本來就在DOM中存在,但是此時是隱藏的,你是可以獲得該元素的,但是缺無法操作

做法就是線程等待或者等待元素可用,推薦第二種,線程等待的時間不定,不穩定

 

複製代碼
public static void sendKeysByXPath(WebDriver driver, String path, String key) {
        WebDriverWait wait = new WebDriverWait(driver, 10); // 最多等10秒
        // 等待元素可見且可被單擊
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath(path)));
        WebElement element = wait.until(new ExpectedCondition<WebElement>() {
            @Override
            public WebElement apply(WebDriver d) {
                return d.findElement(By.xpath(path));
            }
        });
        highLightElement(driver,element);
        element.clear();
        element.sendKeys(key);
    }
複製代碼

9.操作javascript的Alert彈窗

複製代碼
driver.findElement(By.xpath(path)).click();
//切換到alert彈出框
Alert alert = driver.switchTo().alert();
AssertionUtil.assertEquals("這是個alert彈出框", alert.getText());
//使用alert的accept方法,單擊alert的確定按鈕,關閉alert
alert.accept();
//如果alert未彈出,會拋出NoAlertPresentException異常
//切換回去原來的窗體
driver.switchTo().defaultContent();
複製代碼

 

10.操作javascript的confirm彈窗

confirm與alert類似,不同的是

alert.accept();是確定

alert.dismiss();是取消

11.操作frame

有時候我們在定位一個頁面元素的時候發現一直定位不了,反覆檢查自己寫的定位器沒有任何問題,
代碼也沒 有任何問題。這時你就要看一下這個頁面元素是否在一個iframe中,這可能就是找不到的
原因之一。如果你在 一個default content中查找一個在iframe中的元素,那肯定是找不到的。反之
你在一個iframe中查找另一個 iframe元素或default content中的元素,那必然也定位不到

//進入id="frame"或者name="frame"的frame中,
driver.switchTo().frame("frame"); 

12.操作模態框

driver.switchTo().activeElement();

13.父子框

複製代碼
String newHandle = "";//獲取當前窗口  父窗口
String currentHandle = driver.getWindowHandle();//點擊頁面元素打開新窗口
Set<String> handles = driver.getWindowHandles();//獲取瀏覽器所有窗口
Iterator<String> itWin = handles.iterator();while(itWin.hasNext()){
    String key = itWin.next();
    if(currentHandle.equals(key)){
        continue;
    }
    //得到新窗口
    newHandle = key;
}//切換窗口
WebDriver newDriver = driver.switchTo().window(newHandle);
//業務操作
//set中移除新窗口
handles.remove(newHandle);
//切回主窗口
driver.switchTo().window(currentHandle);
複製代碼

 

14.js單擊

有時候在點擊頁面的時候會存在該元素被其他元素覆蓋的情況,比如,元素正被一個模態框擋住,此時模態框還沒有消失,做法是等待

模態框消失,再點擊一次.或者使用js來觸發點擊

複製代碼
/**
     * js執行點擊事件 for:Element is not clickable at point. Other element would
     * receive the click
     * 
     * @param driver
     * @param selector
     */
    public static void clickElementByJS(WebDriver driver, By selector) {
        WebDriverWait wait = new WebDriverWait(driver, 10); // 最多等10秒
        WebElement element = wait.until(new ExpectedCondition<WebElement>() {
            @Override
            public WebElement apply(WebDriver d) {
                return d.findElement(selector);
            }
        });
        ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
    }
複製代碼
發佈了12 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章