八、自動化函數

1.元素的定位

web自動化測試的操作核心是能夠找到頁面對應的元素,然后才能對元素進行具體的操作。

常見的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector

常用的主要由cssSelector和xpath

1.1 cssSelector選擇器

選擇器的功能:選中頁面中指定的標簽元素

選擇器的種類分為基礎選擇器和復合選擇器,常見的元素定位方式可以通過id選擇器和子類選擇器來進行定位。

selector選擇器

xpath

XML路徑語言,不僅可以在XML文件中查找信息,還可以在HTML中選取節點。

xpath使用路徑表達式來選擇xml文檔中的節點

xpath語法中:

xpath://*[@id=“kw”]

1.2.1 獲取HTML頁面所有的節點

//*

1.2.2 獲取HTML頁面指定的節點

//[指定節點]

//ul:獲取HTML頁面所有的ul節點

//input:獲取HTML頁面所有的input節點

1.2.3 獲取一個節點中的直接子節點

/

//span/input

1.2.4 獲取一個節點的父節點

//input/…獲取input節點的父節點

1.2.5實現節點屬性的匹配

[@…]

//*[@id=‘kw’]匹配HTML頁面中id屬性為kw的節點

1.2.6 使用指定索引的方式獲取對應的節點內容

注意:xpath的索引是從1開始的。

百度熱搜xpath定位://*[@id=“s-hotsearch-wrapper”]/div

更便捷的生成selector/xpath的方式:右鍵選擇復制"Copy selector/xpath"

沒有這樣的元素

注意:登錄狀態下和非登錄狀態下自動化打開的頁面不一定相同,因為在做自動化測試一定要注意頁面狀態的一致性NoSuchElementException找不到元素異常

findElement(By) 在頁面查找元素,返回值Element

findElements(By) 在頁面查找元素,返回值為List

2.操作測試對象

獲取到了頁面的元素之后,接下來就是要對元素進行操作了。常見的操作有點擊、提交、輸入、清除、獲取文本。

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.chrome.ChromeOptions;public class SeleniumChromeTest {public static void main(String[] args) throws InterruptedException {// 設置 ChromeDriver 的路徑String chromeDriverPath = "D:\\網頁下載\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"; // 替換為你的 chromedriver 路徑System.setProperty("webdriver.chrome.driver", chromeDriverPath);// 配置 Chrome 瀏覽器選項ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*"); // 解決某些版本的兼容性問題// 初始化 ChromeDriverWebDriver driver = new ChromeDriver(options);try {// 打開目標網頁driver.get("https://www.baidu.com");// 等待頁面加載完成Thread.sleep(2000);// 定位搜索框元素WebElement searchBox = driver.findElement(By.id("kw"));// 在搜索框中輸入內容searchBox.sendKeys("Selenium Java 自動化測試");// 定位“百度一下”按鈕WebElement searchButton = driver.findElement(By.id("su"));// 點擊按鈕提交搜索searchButton.click();// 等待搜索結果加載完成Thread.sleep(3000);// 輸出當前頁面的標題System.out.println("當前頁面標題: " + driver.getTitle());} catch (Exception e) {e.printStackTrace();} finally {// 關閉瀏覽器driver.quit();}}
}
2.1點擊/提交對象

click()

// 找到百度一下按鈕并點擊

driver.findElement(By.cssSelector(“#su”)).click();

除了按鈕之外,頁面的絕大多數元素都可以點擊

頁面隱藏的標簽、不可見的標簽就不能點擊。

第一步篩選:看標簽的屬性是否有hidden關鍵字

第二步:看每個標簽對應的樣式

2.2模擬按鍵輸入

sendKeys(“”)

driver.findElement(By.cssSelector(“#kw”)).sendKeys(“輸入文字”);

輸入框可以接收的內容都可以通過sendKeys發送過去

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.apache.commons.io.FileUtils;import java.io.File;
import java.time.Duration;
import java.util.List;public class FirstTest {WebDriver driver = null;void createDriver() {String chromeDriverPath = "D:\\網頁下載\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"; // 替換為你的 chromedriver 路徑System.setProperty("webdriver.chrome.driver", chromeDriverPath);// 增加瀏覽器配置:創建驅動對象要強制指定允許訪問所有的鏈接// 配置 Chrome 瀏覽器選項ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*"); // 解決某些版本的兼容性問題// 初始化 ChromeDriverdriver = new ChromeDriver(options);}// 測試百度搜索關鍵字:迪麗熱巴void test01() throws InterruptedException {createDriver();try {// 2.輸入完整的網址: https://www.baidu.comdriver.get("https://www.baidu.com");WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));// 3.找到輸入框,并輸入關鍵詞:迪麗熱巴wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#kw"))).sendKeys("迪麗熱巴");// 4.找到百度一下按鈕,并點擊wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su"))).click();} catch (Exception e) {e.printStackTrace();takeScreenshot();} finally {if (driver != null) {Thread.sleep(8000);// 5.關閉瀏覽器driver.quit();}}}private void takeScreenshot() {if (driver != null) {try {File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(screenshot, new File("screenshot.png"));System.out.println("截圖已保存到 screenshot.png");} catch (Exception e) {e.printStackTrace();}}}// 元素的定位void test02() throws InterruptedException {createDriver();// 選擇器driver.findElement(By.cssSelector("#s-hotsearch-wrapper > div"));driver.findElement(By.xpath("//*[@id=\"s-hotsearch-wrapper\"]/div"));List<WebElement> ll = driver.findElements(By.cssSelector("#hotsearch-content-wrapper > li > a >span.title-content-title"));for (int i = 0; i < 10; i++) {// 獲取元素Ele對應的文本System.out.println(ll.get(i).getText());}driver.quit();}// 操作元素void test03() throws InterruptedException {createDriver();//        WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//        ele.click();try {// 打開目標網頁driver.get("https://www.baidu.com");// 等待頁面加載完成Thread.sleep(2000);// 這兩行代碼是上面的測試代碼
//            WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//            ele.click();// 定位搜索框元素WebElement searchBox = driver.findElement(By.id("kw"));// 在搜索框中輸入內容searchBox.sendKeys("Java語言");// 定位“百度一下”按鈕WebElement searchButton = driver.findElement(By.id("su"));// 點擊按鈕提交搜索searchButton.click();// 等待搜索結果加載完成Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();} finally {// 關閉瀏覽器driver.quit();}}
}
2.3清除文本內容

輸入文本后又想換一個新的關鍵詞,這里就需要用到clear()

若想要在一個場景下更換多個關鍵詞,需要將前一個關鍵詞清除掉,若不清除,每次sendKeys將完成拼接的操作

void test03() throws InterruptedException {createDriver();//        WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//        ele.click();try {// 打開目標網頁driver.get("https://www.baidu.com");// 等待頁面加載完成Thread.sleep(2000);// 這兩行代碼是上面的測試代碼
//            WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//            ele.click();// 定位搜索框元素WebElement searchBox = driver.findElement(By.id("kw"));// 在搜索框中輸入內容searchBox.sendKeys("Java語言");Thread.sleep(2000);searchBox.clear();Thread.sleep(2000);searchBox.sendKeys("賞心悅目的圖片");// 定位“百度一下”按鈕WebElement searchButton = driver.findElement(By.id("su"));// 點擊按鈕提交搜索searchButton.click();// 等待搜索結果加載完成Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();} finally {// 關閉瀏覽器driver.quit();}}
2.4獲取文本信息

如果判斷獲取到的元素對應的文本是否符合預期呢?獲取元素對應的文本并打印一下

獲取文本信息:getText()

為什么打印的txt為空?

因為"百度一下"是input標簽里的屬性值 getAttribute(String)

2.5獲取當前頁面標題和URL

getTitle()

getCurrentUrl()

3.窗口設置大小

1)窗口的大小設置

// 窗口最小化
driver.manage().window().minimize();
// 窗口最大化
driver.manage().window().maximize();
// 窗口全屏
driver.manage().window().fullscreen();
// 手動設置窗口大小
driver.manage().window().setSize(new Dimension(800, 600));

打開百度新聞(窗口的切換)

是兩個新聞標簽頁

1)獲取當前頁面句柄

driver.getWindowHandle();

2)獲取所有頁面句柄:

driver.getWindowHandles();

void test04() {createDriver();try {// 打開百度首頁driver.get("https://www.baidu.com");System.out.println("已打開百度首頁:" + driver.getTitle());// 顯式等待頁面加載完成WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));// 點擊“新聞”鏈接WebElement newsLink = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));newsLink.click();System.out.println("已點擊新聞鏈接");// 獲取當前窗口句柄String curHandle = driver.getWindowHandle();System.out.println("當前窗口句柄為:" + curHandle);System.out.println("===============================================");// 獲取所有窗口句柄并切換到新窗口Set<String> allHandles = driver.getWindowHandles();for (String handle : allHandles) {if (!handle.equals(curHandle)) { // 使用 equals() 比較字符串driver.switchTo().window(handle);System.out.println("跳轉之后:" + driver.getTitle());// 顯式等待目標元素加載完成WebElement headlineTabs = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#headline-tabs > ul")));System.out.println("找到目標元素:" + headlineTabs.getText());break; // 切換到新窗口后退出循環}}} catch (Exception e) {e.printStackTrace();} finally {// 關閉瀏覽器if (driver != null) {driver.quit();}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76953.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web三漏洞學習(其二:sql注入)

靶場&#xff1a;NSSCTF 、云曦歷年考核題 二、sql注入 NSSCTF 【SWPUCTF 2021 新生賽】easy_sql 這題雖然之前做過&#xff0c;但為了學習sql&#xff0c;整理一下就再寫一次 打開以后是杰哥的界面 注意到html網頁標題的名稱是 “參數是wllm” 那就傳參數值試一試 首先判…

單片機非耦合業務邏輯框架

在小型單片機項目開發初期&#xff0c;由于業務邏輯相對簡單&#xff0c;我們往往較少關注程序架構層面的設計。 然而隨著項目經驗的積累&#xff0c;開發者會逐漸意識到模塊間的耦合問題&#xff1a;當功能迭代時&#xff0c;一處修改可能引發連鎖反應。 此時&#xff0c;構…

Zookeeper三臺服務器三節點集群部署(docker-compose方式)

1. 準備工作 - 服務器:3 臺服務器,IP 地址分別為 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安裝 Docker:確保每臺服務器已安裝 Docker 和 Docker Compose。 - 網絡通信:確保三臺服務器之間可以通過 IP 地址互相訪問,并開放以下端口: - `2181`:Zookeeper 客戶…

Mac關閉sip方法

Mac關閉sip方法 導航 文章目錄 Mac關閉sip方法導航完整操作流程圖詳細步驟 完整操作流程圖 這東西是我在網上搬運下來的&#xff0c;但是我在為業務實操過程中&#xff0c;根據實操情況還是有新的注意點的 詳細步驟 1.在「關于本機」-「系統報告」-「軟件」;查看SIP是否開啟…

C++| 深入剖析std::list底層實現:鏈表結構與內存管理機制

引言 std::list的底層實現基于雙向鏈表&#xff0c;其設計哲學與std::vector截然不同。本文將深入探討其節點結構、內存分配策略及迭代器實現原理&#xff0c;揭示鏈表的性能優勢和潛在代價。 1. 底層數據結構&#xff1a;雙向鏈表 每個std::list節點包含&#xff1a; 數據域…

漢諾塔問題——用貪心算法解決

目錄 一&#xff1a;起源 二&#xff1a;問題描述 三&#xff1a;規律 三&#xff1a;解決方案 遞歸算法 四&#xff1a;代碼實現 復雜度分析 一&#xff1a;起源 漢諾塔&#xff08;Tower of Hanoi&#xff09;問題起源于一個印度的古老傳說。在世界中心貝拿勒斯&#…

【Python】Python 100題 分類入門練習題 - 新手友好

Python 100題 分類入門練習題 - 新手友好篇 - 整合篇 一、數學問題題目1&#xff1a;組合數字題目2&#xff1a;利潤計算題目3&#xff1a;完全平方數題目4&#xff1a;日期天數計算題目11&#xff1a;兔子繁殖問題題目18&#xff1a;數列求和題目19&#xff1a;完數判斷題目21…

【linux】--- 進程概念

進程概念 1.認識馮諾依曼結構2. 操作系統&#xff08;Operator system)2.1 概念2.2 設計OS的目的2.3 理解操作系統2.4 如何理解管理2.5 理解系統調用和庫函數 3. 進程3.1 基本概念和基本操作3.1.1 描述進程 - PCB3.1.2 task_struct3.1.3 查看進程 3.2 進程狀態3.2.1 運行&&…

算法堆排序記錄

【算法】排序算法之堆排序 - 知乎 應用場景&#xff1a;獲取第n個大或者小的數 操作步驟&#xff1a; 1、將數組構造成堆 2、調整根節點為最大堆 ->倒序對每個根節點執行最大化 ->根節點最大化過程中如果發生交換&#xff0c;需要保證子節點也為最大堆&#xff08;執行…

STM32 模塊化開發實戰指南:系列介紹

本文是《STM32 模塊化開發實戰指南》系列的導讀篇,旨在介紹整個系列的寫作目的、適用讀者、技術路徑和每一篇的主題規劃。適合從事 STM32、裸機或 RTOS 嵌入式開發的個人開發者、初創工程師或企業項目團隊。 為什么要寫這個系列? 在嵌入式開發中,很多人剛開始都是從點亮一個…

【眼底輔助診斷開放平臺】項目筆記

這是一個標題 任務一前端頁面開發&#xff1a;后端接口配置&#xff1a; 任務二自行部署接入服務 日志修改樣式和解析MD文檔接入服務 Note前端登陸不進去/更改后端api接口304 Not Modifiedlogin.cache.jsonERR_CONNECTION_TIMED_OUT跨域一般提交格式proxy.ts src/coponents 目錄…

【后端開發】Spring MVC-計算器、用戶登錄、留言板

文章目錄 前后端分離設計接口設計思路項目問題解決思路 計算器需求分析接口定義前端頁面代碼服務器代碼 用戶登錄需求分析接口定義用戶登錄校驗接口查詢登錄用戶接口 前端頁面代碼用戶登錄校驗查詢登錄用戶 服務器代碼前后端交互 留言版需求分析接口定義獲取全部留言發布留言前…

在Ubuntu-22.04.5中安裝ONLYOFFICE DocSpace(協作空間)【注意:安裝失敗,謹慎參考!】

1. 通過Docker安裝 預計需要下載10G的鏡像。 &#xff08;1&#xff09;下載docspace安裝腳本 curl -fsSL https://download.onlyoffice.com/docspace/docspace-install.sh -o docspace-install.sh &#xff08;2&#xff09;修改docker compose的別名為docker-compose ali…

2025年計算機領域重大技術突破與行業動態綜述

——前沿技術重塑未來&#xff0c;開發者如何把握機遇&#xff1f; 2025年第一季度&#xff0c;全球計算機領域迎來多項里程碑式進展&#xff0c;從量子計算到人工智能&#xff0c;從芯片設計到網絡安全&#xff0c;技術革新與產業融合持續加速。本文梳理近三個月內最具影響力…

一、LLM 大語言模型初窺:起源、概念與核心原理

一、初識大模型 1.1 人工智能演進與大模型興起:從A11.0到A12.0的變遷 AI 1.0時代&#xff08;2012-2022年&#xff09; 感知智能的突破&#xff1a;以卷積神經網絡&#xff08;CNN&#xff09;為核心&#xff0c;AI在圖像識別、語音處理等感知任務中超越人類水平。例如&#…

Redis 分布式鎖+秒殺異步優化

文章目錄 問題思路setnx實現鎖誤刪問題和解決方案Redis Lua腳本問題引出解決方案 setnx實現的問題Redission快速入門redission可重入鎖原理 秒殺優化(異步優化)異步秒殺思路秒殺資格判斷Redis消息隊列 問題 比如我們兩個機器都部署了我們項目&#xff0c;這里nginx使用輪詢的方…

機器學習中的距離度量與優化方法:從曼哈頓距離到梯度下降

目錄 前言一、曼哈頓距離(Manhattan Distance)&#xff1a;二、切比雪夫距離 (Chebyshev Distance)&#xff1a;三、 閔可夫斯基距離(Minkowski Distance)&#xff1a;小結四、余弦距離(Cosine Distance)五、杰卡德距離(Jaccard Distance)六、交叉驗證方法6.1 HoldOut Cross-v…

HTML 嵌入標簽對比:小眾(<embed>、<object>) 與 <iframe> 的優缺點及使用場景和方式

需求背景 在網頁開發中&#xff0c;嵌入外部資源預覽&#xff08;如視頻、PDF、地圖或其他網頁&#xff09;是常見的需求。HTML 提供了多種標簽來實現這一功能&#xff0c;其中 <embed>、<object> 和 <iframe> 是最常用的三種。本文將對比它們的優缺點&…

未來七軸機器人會占據主流?深度解析具身智能方向當前六軸機器人和七軸機器人的區別,七軸力控機器人發展會加快嗎?

六軸機器人和七軸機器人在設計、功能和應用場景上存在明顯區別。六軸機器人是工業機器人的傳統架構&#xff0c;而七軸機器人則在多自由度和靈活性方面進行了增強。 本文將在理解這兩者的區別以及為何六軸機器人仍然是市場主流&#xff0c;從多個方面進行深入解讀六軸和七軸區…

C++基礎精講-07

文章目錄 1. const對象2. 指向對象的指針3. 對象數組4. c中const常見用法總結4.1 修飾常量4.2 修飾指針4.3 修飾函數參數4.4 修飾函數返回值4.5 修飾成員函數4.6 const對象 5. 賦值運算符函數&#xff08;補充&#xff09;5.1 概念5.2 默認賦值運算符函數局限5.3 解決辦法 1. c…