【UI自動化-3】UI自動化元素操作專題

前言

在熟悉了元素定位之後,我們接下來就要學習對定位到的元素進行操作這項內容了。我簡要做了個總結,如下圖:
在這裏插入圖片描述

基本操作

元素的基本操作有很多,常用的有三個:click(點擊)、clear(清空)、sendkeys(輸入內容)、submit(提交)。何爲基本操作,即這些方法在WebElement接口類中定義,通過實例化的WebElement直接調用。

  1. void click():單擊目標元素。
  2. void submit():提交當前form(表單)內容到遠程服務器,注意是特定於表單元素而言的。
  3. void sendKeys(CharSequence... keysToSend):使用此方法模擬鍵入元素,這可能會設置元素的值。一般是對文本輸入元素進行此操作,否則會報錯org.openqa.selenium.ElementNotInteractableException: element not interactable
  4. void clear():如果此元素是文本輸入元素(INPUT型元素和TEXTAREA元素),則將清除該值。對其他元素沒有影響。此方法並不會觸發鼠標和鍵盤操作。
  5. String getTagName():獲取並返回此元素的tagNameString類型)。
  6. String getAttribute(String name):獲取並返回當前元素的給定屬性的值(String類型)。
  7. boolean isSelected():確定是否選擇了此元素。此操作僅適用於輸入元素,如checkboxes(複選框)、options in a select(下拉選擇框中的選項) 和 radio buttons(單選框按鈕)
  8. boolean isEnabled():元素當前是否已啓用?除了禁用的輸入元素之外的內容,通常都會返回true
  9. String getText():獲取此元素及子元素的可見(即不被CSS隱藏)內文本,不帶任何前導或尾隨空格。
  10. boolean isDisplayed():是否顯示此元素?
  11. Point getLocation():獲取並返回此元素的左上角在頁面上的位置(以一組x,y軸座標值表示)。
  12. Dimension getSize():獲取並返回此元素的高度和寬度(一對整型像素值,如332,450)
  13. Rectangle getRect():呈現元素的位置和大小。
  14. String getCssValue(String propertyName):獲取並返回此元素給定CSS屬性的值(String類型)

select操作

select,即下拉選擇框,這類元素的操作一般是選中select中的某一項,selenium中的Select類提供了很多對select元素的操作方法。
首先,從Select類的有參構造函數可以看出,在初始化一個select時,需要WebElement作爲入參。接下來,我們看看,Select類提供了哪些函數吧。

首先,我們最關心的當然是,下拉選擇的相關方法,其中單選3個方法:

  1. void selectByVisibleText(String text):使用可見文本來選中某一項
  2. void selectByIndex(int index):使用索引來選中某一項
  3. void selectByValue(String value):使用value來選中某一項

相對應的,多選也有4個方法(當然多選需要select標籤的multiple屬性的值爲multiple):

  1. void deselectAll():選中所有項
  2. void deSelectByVisibleText(String text):使用可見文本來選中某一項。
  3. void deSelectByIndex(int index):使用索引來選中某一項。
  4. void deSelectByValue(String value):使用value來選中某一項。

另外,還提供一些其他方法:

  1. boolean isMultiple():此select元素的multiple屬性的值是否爲multiple
  2. List<WebElement> getOptions():返回此select元素所有的項。
  3. List<WebElement> getAllSelectedOptions():返回此select元素所有選中狀態的項的集合。
  4. WebElement getFirstSelectedOption():返回此select元素第一個選中狀態的項。
  5. setSelected(WebElement option, boolean select):使得此select元素的某項被點擊(從而被選中),這個方法是下拉選擇的相關方法的核心實現方法。

下面用一個實例演示一下select的操作。

示例代碼-select-1:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UI自動化測試頁面</title>
</head>
<body>
<div id="div">
    <select id="city" multiple="multiple">
        <option value="">請選擇一個城市</option>
        <option value="010" selected>北京</option>
        <option value="021">上海</option>
        <option value="0571">杭州</option>
    </select>
</div>
</body>
</html>

實現代碼-select-1:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

/**
 * @author muguozheng
 * @date 2020/4/18 17:56
 * @Description: 元素定位測試
 * @modify
 */
public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面-路徑改成自己的
            driver.get("file:///E:/project/automation/src/test/java/test.html");
            // 獲取select元素
            WebElement element = driver.findElement(By.cssSelector("#city"));
            // 實例化一個select
            Select select = new Select(element);

            select.selectByVisibleText("上海");
            // 增加延時以便觀察
            Thread.sleep(3000);
            select.selectByIndex(3);
            Thread.sleep(3000);
            select.selectByValue("010");

            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

頁面跳轉

這裏的頁面跳轉是廣義上的,包括跳轉到window(新頁面)、framealert彈窗等。在selenium中,是藉助switchTo()函數完成的。我們查看源碼,發現switchTo()函數的返回值是TargetLocator,這是接口類WebDriver的一個內部接口,這個內部接口定義一系列跳轉方法。

這些方法的返回值都是WebDriver,我們可以理解爲driver的焦點發生了轉移。因此,有一點需要留意,既然焦點轉移到了新的頁面上,那麼想要定位原頁面的元素,就要跳轉回去。

frame跳轉

  1. WebDriver frame(int index):根據索引獲取frame
  2. WebDriver frame(String nameOrId):根據name或id獲取frame
  3. WebDriver frame(WebElement frameElement):根據WebElement(也就是可以用xpath、css等定位到frame元素作爲參數)獲取frame
  4. WebDriver parentFrame():轉移焦點到父級內容,如果當前內容是頂級內容,將不發生變化。

下面進行實例演示。

頁面代碼-frame-1:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UI自動化測試頁面</title>
</head>
<body>
<div id="div">
    <select id="city">
        <option value="">請選擇一個城市</option>
        <option value="010">北京</option>
        <option value="021">上海</option>
        <option value="0571">杭州</option>
    </select>
</div>
<iframe style="height:1000px;width:100%" id="myIframe" src="http://www.baidu.com"></iframe>
</body>
</html>

實現代碼-frame-1:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("file:///E:/project/automation/src/test/java/test.html");
            // 跳轉到frame
            // driver.switchTo().frame("myIframe") 通過nameOrId跳轉
            // frame(WebElement frameElement)方式跳轉
            driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='myIframe']")));
            // 在frame中進一步操作
            driver.findElement(By.id("kw")).sendKeys("測試");
            Thread.sleep(3000);
            // 跳轉回父級頁面
            driver.switchTo().parentFrame();
            Select select = new Select(driver.findElement(By.id("city")));
            select.selectByValue("010");

            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

窗口跳轉

當我們點擊了a標籤元素時,會觸發打開鏈接頁面的事件,有兩種情形:

  1. 在當前窗口加載新頁面內容
  2. 新建一個窗口加載新頁面內容,這種情況在a標籤有target="_blank"時觸發

當發生第2種情況時,同上文的frame類似,由於driver的焦點還停留在原窗口,我們在新窗口的頁面上定位元素時,自然會產生錯誤,因此引出driver焦點跳轉問題。

selenium提供了唯一的窗口跳轉方法:WebDriver window(String nameOrHandle),方法的入參nameOrHandle意爲窗口名稱(name)或句柄(handle),但查看源碼和很多資料也沒弄清楚窗口的name是什麼,只好先研究一下handle了。

通過handle跳轉窗口有3種思路:

  1. 先記錄當前窗口句柄記爲句柄1(String getWindowHandle()),打開新頁面後獲取所有窗口句柄的集合,遍歷此集合,與句柄1不同則跳轉該句柄所指向的窗口。
  2. 打開新的頁面後獲取當前所有窗口句柄(Set<String> getWindowHandles()),通過索引(越晚打開的窗口,其索引越大)來跳轉到目標窗口。
  3. 打開新的頁面後獲取當前所有窗口句柄,通過窗口標題(title)來跳轉到目標窗口。

下面通過一個例子來進行演示,我們要實現的場景是:

  1. 打開【UI自動化測試頁面】,點擊超鏈接,在新窗口打開【UI自動化-新頁面】。
  2. 在【UI自動化-新頁面】的輸入框輸入"新頁面"。
  3. 返回【UI自動化測試頁面】,在輸入框輸入【原頁面】。

頁面代碼-window-1:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UI自動化測試頁面</title>
</head>
<body>
<div id="div">
    <a id="new_page" target="_blank" href="file:///E:/project/58coin/automation/src/test/java/testNew.html">點擊跳轉新頁面</a>
</div>
<div style="margin-top: 10px">
    <input type="text" id="input">
</div>
</body>
</html>

頁面代碼-window-2:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UI自動化-新頁面</title>
</head>
<body>
<div>
    <input type="text" id="new_input">
</div>
</body>
</html>

實現代碼-window-1(句柄對比方式):

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("file:///E:/project/automation/src/test/java/test.html");
            // 獲取當前窗口句柄
            String handlePresent = driver.getWindowHandle();
            // 點擊超鏈接打開新頁面
            driver.findElement(By.id("new_page")).click();

            // 遍歷句柄集合,與handlePresent不同,則是新窗口,跳轉並結束遍歷
            Set<String> handles = driver.getWindowHandles();
            for (String handle : handles) {
                if (!handle.equals(handlePresent)) {
                    driver.switchTo().window(handle);
                    break;
                }
            }
            System.out.println("當前頁面title:" + driver.getTitle());
            driver.findElement(By.cssSelector("#new_input")).sendKeys("新頁面");
            Thread.sleep(1000); // 暫停1s以便觀察
            // 跳轉到原來窗口
            driver.switchTo().window(handlePresent);
            System.out.println("當前頁面title:" + driver.getTitle());
            driver.findElement(By.id("input")).sendKeys("原頁面");
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

實現代碼-window-2(索引方式):

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("file:///E:/project/automation/src/test/java/test.html");
            // 點擊超鏈接打開新頁面
            driver.findElement(By.id("new_page")).click();

            Set<String> winSet = driver.getWindowHandles();//獲取所有句柄
            List<String> winList = new ArrayList<String>(winSet);//轉成list列表
            // 跳轉到最新打開的窗口
            driver.switchTo().window(winList.get(winList.size() - 1));

            System.out.println("當前頁面title:" + driver.getTitle());
            driver.findElement(By.cssSelector("#new_input")).sendKeys("新頁面");
            Thread.sleep(1000); // 暫停1s以便觀察
            // 跳轉到倒數第二個打開的窗口
            driver.switchTo().window(winList.get(winList.size() - 2));

            System.out.println("當前頁面title:" + driver.getTitle());
            driver.findElement(By.id("input")).sendKeys("原頁面");
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

實現代碼-window-3(標題方式):

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("file:///E:/project/automation/src/test/java/test.html");

            // 點擊超鏈接打開新頁面
            driver.findElement(By.id("new_page")).click();

            // 獲取窗口句柄的集合(set)
            Set<String> handles = driver.getWindowHandles();
            // 遍歷並通過title判斷目標窗口
            for (String handle : handles) {
                if (driver.switchTo().window(handle).getTitle().contains("UI自動化-新頁面")) {
                    driver.switchTo().window(handle);
                    break;
                }
            }
            System.out.println("當前頁面title:" + driver.getTitle());
            driver.findElement(By.cssSelector("#new_input")).sendKeys("新頁面");
            Thread.sleep(1000); // 暫停1s以便觀察
            
            // 遍歷並通過title判斷目標窗口
            for (String handle : handles) {
                if (driver.switchTo().window(handle).getTitle().contains("UI自動化測試頁面")) {
                    driver.switchTo().window(handle);
                    break;
                }
            }
            System.out.println("當前頁面title:" + driver.getTitle());
            driver.findElement(By.id("input")).sendKeys("原頁面");
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

alert跳轉

alert彈窗本質是js原生代碼,不是標籤元素,並且一個頁面中最多有且僅有一個alert彈窗,如果頁面中出現了alert彈窗,一定要先處理它,不然無法進行其他操作。alert彈窗切換的操作非常簡單。

Alert接口中提供了以下幾個方法:

  1. void dismiss():點擊彈窗的取消按鈕
  2. void accept():點擊彈窗的確認按鈕
  3. String getText():獲取彈窗的文本內容
  4. void sendKeys(String keysToSend):向彈窗中輸入內容

下面演示一個示例:

頁面代碼-alert-1:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UI自動化測試頁面</title>
    <script type="text/javascript">
        function display_alert() {
            alert("I am an alert box!!")
        }
    </script>
</head>
<body>
<div>
    <input type="button" id="alert" onclick="display_alert()" value="Display alert box"/>
    <input type="text" id="input">
</div>
</body>
</html>

實現代碼-alert-1:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("file:///E:/project/automation/src/test/java/test.html");
			// 點擊彈窗按鈕
            driver.findElement(By.id("alert")).click();
            // 彈窗確定:沒有這一步處理,後續操作將報錯
            driver.switchTo().alert().accept();
            // 輸入框輸入內容
            driver.findElement(By.id("input")).sendKeys("測試");

            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

鼠標操作

在selenium中,所有的鼠標操作的實現全部由Actions類提供。首先,Actions類提供了多個有參構造方法:

public Actions(WebDriver driver)
public Actions(Keyboard keyboard, Mouse mouse)
public Actions(Keyboard keyboard)

但後兩個構造方法只是擴展方法,很少用。第一個構造方法纔是最重要的,它的入參是當前的WebDriver

再讓我們看一下這個類提供了哪些操作鼠標的方法:

  1. Actions clickAndHold(WebElement target):在特定元素上單擊鼠標左鍵(不釋放)
  2. Actions release(WebElement target):在特定元素上釋放鼠標左鍵
  3. Actions doubleClick(WebElement target):在特定元素上雙擊鼠標左鍵
  4. Actions moveToElement(WebElement target):移動鼠標指針到特定元素
  5. Actions contextClick(WebElement target):在特定元素上右鍵單擊
  6. Actions dragAndDrop(WebElement source, WebElement target):拖拽元素
  7. void perform():執行具體的操作。前面6個方法都是聲明一個操作,只有調用perform()後纔會真正執行操作。

下面以拖拽元素做一下鼠標操作的演示:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("https://www.runoob.com/try/try-cdnjs.php?filename=jqueryui-api-droppable");
            // 跳轉到右側iframe
            driver.switchTo().frame("iframeResult");

            WebElement source = driver.findElement(By.id("draggable"));
            WebElement target = driver.findElement(By.id("droppable"));

            Actions actions = new Actions(driver);
            actions.dragAndDropBy(source, 110, 120).perform();
            Thread.sleep(2000); // 延時以觀察效果
            actions.dragAndDrop(source, target).perform();

            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

鍵盤操作

對於鍵盤的模擬操作,Actions 類中有提供 keyUp(CharSequence key)keyDown(CharSequence key)sendKeys(CharSequence key) 等方法來實現。

另外在Keys類中,提供了很多模擬按鍵,如BACK_SPACEENTER等。

對於普通鍵盤,使用 sendKeys(CharSequence key) 就可以實現:

Actions action = new Actions(driver); 
action.sendKeys(Keys.BACK_SPACE);// 模擬按下並釋放 BACK_SPACE鍵
action.sendKeys(Keys.ENTER);// 模擬按下並釋放回車鍵

而對於修飾鍵,在 WebDriver 中需要用到 KeyDown(theKey)、keyUp(theKey) 方法來操作。

Actions action = new Actions(driver); 
action.keyDown(Keys.CONTROL);// 按下 Ctrl 鍵
action.keyDown(Keys.SHIFT);// 按下 Shift 鍵
action.keyDown(Key.ALT);// 按下 Alt 鍵
action.keyUp(Keys.CONTROL);// 釋放 Ctrl 鍵
action.keyUp(Keys.SHIFT);// 釋放 Shift 鍵
action.keyUp(Keys.ALT);// 釋放 Alt 鍵

修飾鍵是鍵盤上的一個或者一組特別的鍵,包括Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)等,與一般按鍵同時使用的時候,用來臨時改變一般鍵盤的普通行爲。

我們發現, Actions 類和WebElement 類都有一個sendKeys(CharSequence key)方法,這兩個方法對於一般的輸入操作基本上相同,不同點在於以下幾點:

  1. Actions 中的sendKeys(CharSequence key)對於修飾鍵 (Modifier Keys) 的調用並不會釋放,也就是說當調用 actions.sendKeys(Keys.ALT)actions.sendKeys(Keys.CONTROL)action.sendKeys(Keys.SHIFT)的時候,相當於調用 actions.keyDown(keysToSend),而如果在現實的應用中想要模擬按下並且釋放這些修飾鍵,應該再調用 action.sendKeys(keys.NULL) 來完成這個動作。
  2. ActionssendKeys(keysToSend) 執行完之後,焦點就不在當前元素了。所以我們可以使用 sendKeys(Keys.TAB) 來切換元素的焦點,從而達到選擇元素的作用,這個最常用到的場景就是在用戶名和密碼的輸入過程中。

下面以一個百度搜索測試的例子來演示鍵盤操作:

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 訪問測試頁面
            driver.get("http://www.baidu.com");
            WebElement input = driver.findElement(By.id("kw"));
            input.sendKeys("測試試");
            // 按下退格鍵刪除最後一個字
            input.sendKeys(Keys.BACK_SPACE);
            Thread.sleep(1000);

            Actions actions = new Actions(driver);
            // 按下回車鍵
            actions.sendKeys(Keys.ENTER).perform();

            Thread.sleep(15000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

元素等待

在UI自動化執行過程中,如果頁面或元素沒有加載完成,就進行下一步操作,無疑是會拋出異常的,因此selenium提供了多種元素等待的方法。

隱式等待

隱式等待是一種全局設置,在driver的整個生命週期都有效,設置方式如下:

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

按源碼解釋,驅動程序會輪詢頁面,直到找到該元素(找到後立即執行下一步)或超時(拋出org.openqa.selenium.NoSuchElementException)。這種設置應該謹慎,充分考慮Xpath等方式定位元素較慢的可能性。

顯式等待

顯示等待相對於隱式等待更加靈活,能針對各個元素進行單獨的設置。只有滿足顯式等待的條件滿足,測試代碼纔會繼續向後執行後續的測試邏輯,如果超過設定的最大顯式等待時間閾值, 這測試程序會拋出異常。

等待方法由ExpectedConditions類提供,常用的有以下幾個(E代表ExpectedCondition):

  1. E<Boolean> titleIs(final String title):判斷標題是否是給定標題。
  2. E<Boolean> titleContains(final String title):判斷標題是否包含給定標題。
  3. E<WebElement> presenceOfElementLocated(final By locator):判斷頁面元素在頁面中存在。
  4. E<Boolean> textToBePresentInElement(final WebElement element, final String text):給定元素中是否包含特定的文本。
  5. E<WebElement> elementToBeClickable(final By locator):判斷給定元素是否可點擊。
  6. E<Boolean> elementToBeSelected(WebElement element):判斷給定元素是否處於選中狀態。

還有非常多的其他判斷方法,可以根據場景靈活選用。下面以百度搜索爲例,演示顯示等待的使用:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ElementTest {
    public static void main(String[] args) {
        // 指定瀏覽器驅動的路徑
        String driverPath = "E:/source/driver/chromedriver_80_2.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        // 創建一個chrome driver
        WebDriver driver = new ChromeDriver();
        // 頁面最大化
        driver.manage().window().maximize();

        try {
            // 設定顯示等待時間爲3s
            WebDriverWait wait = new WebDriverWait(driver, 3);
            // 訪問測試頁面
            driver.get("http://www.baidu.com");
            // 設置By.id("abc")這個元素加載完成才進行下一步,最多等待3s,否則拋出異常
            wait.until(ExpectedConditions.presenceOfElementLocated(By.id("abc")));
            driver.findElement(By.id("kw")).sendKeys("測試");
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章