1.準備工作
1.1.下載瀏覽器
自動化測試首先我們要準備一個瀏覽器,我們這里使用谷歌(chrome)瀏覽器.
1.2.安裝驅動管理
每一個瀏覽器都是靠瀏覽器驅動程序來啟動,但是瀏覽器的版本更新非常快,可能我們今天測試的是一個版本,第二天發布了一個新的版本,那么我們就要重構代碼,很不方便.于是selenium幫我們生成了驅動管理依賴,只要引入依賴.就不要我們手動的去處理瀏覽器版本的問題,只需要我們在pom.xml文件中引入依賴,每次使用都會幫助我們下載新的驅動
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope>
</dependency>
此外我們還要引入selenium依賴
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version>
</dependency>
1.3創建項目
創建一個maven項目
引入相關依賴
到此準備工作就完成了
2. 編寫自動化腳本
2.1 創建文件
對于代碼的測試我們一般都是在test目錄下創建,也可以在main方法中創建,但是一般規范都是讓我們在test中創建,FirstTest用來編寫我們的自動化腳本,run是執行我們的腳本
?2.2 編寫代碼
2.2.1 使用代碼下載對應的瀏覽器驅動
//自動下載與當前系統和瀏覽器版本匹配的驅動程序WebDriverManager.chromedriver().setup();
2.2.2? 瀏覽器訪問限制處理
//訪問限制處理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");
2.2.3 生成一個瀏覽器對象完成初始訪問
//生成一個瀏覽器對象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.quit();
整體代碼:
public void test(){//自動下載與當前系統和瀏覽器版本匹配的驅動程序WebDriverManager.chromedriver().setup();//訪問限制處理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//生成一個瀏覽器對象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.quit();}
當我們完成一次操作之后要關閉driver對象.[driver.quit();]
這樣我們就完成了一次簡單的簡單的測試用例
3.自動化常用方法
我們先把下載驅動,創建一個瀏覽器對象,解除瀏覽器限制封裝成一個方法,這樣就減少了代碼的冗余
public void createDriver() throws InterruptedException {//自動下載與當前系統和瀏覽器版本匹配的驅動程序WebDriverManager.chromedriver().setup();//訪問限制處理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//生成一個瀏覽器對象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");}
3.1 元素的定位
一般定位一個元素我們一般使用cssSelector和Xpath.
獲取web元素按照上述操作定位元素位置之后,右鍵可以復制?Selector和Xpath
3.1.1?cssSelector
public void test01(){createDriver();//找到搜索框之后,輸入搜索關鍵字鞠婧祎driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");//點擊按鈕,也就是"百度一下".click(點擊操作)driver.findElement(By.cssSelector("#su")).click();driver.quit();}
findeElement:用于定位某個元素
By.cssSelector 使用 CSS 選擇器語法來定位 HTML 元素.
"#kw" 表示通過 id 屬性為 kw 的元素進行定位.(百度的搜索框元素id為kw)
sendKeys:用于向指定的頁面元素發送按鍵(輸入文本或模擬鍵盤操作)
click:用于模擬用戶點擊頁面上的某個元素
driver.quit():關閉由 WebDriver 打開的所有瀏覽器窗口,并終止與瀏覽器的會話連接。
3.1.2 Xpath?
//使用Xpath定位public void test02() {createDriver();driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("鞠婧祎");driver.findElement(By.xpath("//*[@id=\"su\"]")).click();driver.quit();}
3.2 操作測試對象
3.2.1 click
//找到百度?下按鈕并點擊
driver.findElement(By.cssSelector("#su")).click();
?3.2.2 sendKeys("")
driver.findElement(By.cssSelector("#kw")).sendKeys("輸??字");
3.2.3清除?本內容(clear)
將一開始輸入的鞠婧祎刪除后緊接著搜索章若楠
如果不使用clear(),我們搜索的詞條就是"鞠婧祎章若楠"
public void test03() throws InterruptedException {createDriver();driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.findElement(By.cssSelector("#kw")).clear();driver.findElement(By.cssSelector("#kw")).sendKeys("章若楠");Thread.sleep(3000);driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);driver.quit();}
3.2.4 獲取文本信息(getText())
public void test04() {createDriver();String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a")).getText();System.out.println(text);driver.quit();}
?

3.2.5 獲取當前頁面標題(getTitle())或URL(getCurrentUrl)
//獲取標題或urlpublic void test05() {createDriver();String title = driver.getTitle();String currentUrl = driver.getCurrentUrl();System.out.println(title);System.out.println(currentUrl);driver.quit();}
3.2.6窗口
句柄:每個瀏覽器窗口或標簽頁都有一個唯一的標識符(字符串形式),稱為窗口句柄?
3.2.6.1 獲取百度首頁句柄以及新聞頁面句柄
public void test06() {createDriver();//進入新聞頁面driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();//獲取百度首頁句柄String curHandle = driver.getWindowHandle();System.out.println(curHandle);System.out.println("========================");//獲取所有句柄Set<String> windowHandles = driver.getWindowHandles();for (String handle:windowHandles){System.out.println(handle);}driver.quit();}
3.2.6.2 切換句柄
當前driver對象指向的是百度首頁的句柄,我們要使用新聞頁的元素,就要切換窗口,讓driver指向新聞頁
3.2.6.3 設置窗口大小
//窗?最?化
driver.manage().window().maximize();
//窗?最?化
driver.manage().window().minimize();
//全屏窗?
driver.manage().window().fullscreen();
//?動設置窗???
driver.manage().window().setSize(new Dimension(1024, 768));
3.3 屏幕截圖
有時為了觀察我們測試結果,需要保存圖片,于是selenium幫我們生成了截圖
void getScreenShot(String str) throws IOException {// ./src/test/image/// /2024-07-17/// /test01-174530.png// /test02-174530.png// /2024-07-18/// /test01-174530.png// /test02-174530.pngSimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//./src/test/image/2024-07-17/test01-174530.pngString filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";System.out.println("filename:"+filename);File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcFile,new File(filename));}
SimpleDateFormat sim1:該行代碼創建了一個日期格式化對象 sim1,用于將時間戳格式化為“年-月-日”的字符串形式
3.4 關閉窗口
//表示關閉當前標簽頁
driver.close();
//斷開連接,關閉driver對象
driver.quit();
3.5 等待
3.5.1 強制等待
Thread.sleep();
優點:代碼簡單
缺點:影響運行效率,浪費大量時間
3.5.2 隱式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//等待機制的隱式等待//隱式等待只是查找元素,并不關注元素結果對不對,只要是有結果,就繼續執行public void test13() throws InterruptedException {createDriver();driver.findElement(By.cssSelector("#kw")).sendKeys("鄧紫棋");driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"));driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));//隱式等待,查找后發現有"#kw",所以不管.clear是否執行完成,就繼續查找下一個元素是否存在driver.findElement(By.cssSelector("#kw")).clear();//隱式等待,查找后發現有"#kw",所以不管.sendKeys是否執行完成,就繼續查找下一個元素是否存在driver.findElement(By.cssSelector("#kw")).sendKeys("迪麗熱巴");//隱式等待,查找后發現有"#su",所以不管.click是否執行完成,就繼續查找下一個元素是否存在driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);//如果我們不強制等待上述的三個指令執行完成的話,那么迪麗熱巴這個詞條可能還沒完成輸入(sendKeys("迪麗熱巴");),點擊查詢按鈕(.click();),隱式等待就已經查詢完畢了//此時迪麗熱巴詞條還沒有進行搜索,就結束,所以還是會返回鄧紫棋//Thread.sleep(3000);就是為了等待 driver.findElement(By.cssSelector("#kw")).sendKeys("迪麗熱巴");// driver.findElement(By.cssSelector("#su")).click();執行完畢,更新#\31 > div > div > div > div > div > div.header值為迪麗熱巴WebElement ele=driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"));System.out.println(ele.getText());driver.quit();
3.5.3 顯式等待
elementToBeClickable:等待直到指定的元素在頁面上可見并且可以被點擊
WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(3));wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
??等待某個元素的文本內容為 "預期文本"(就是看括號內文本在不在前端頁面中)
wait.until(ExpectedConditions.textToBe());
wait.until(ExpectedConditions.presenceOfElementLocated())
urlToBe(java.lang.String url)
3.6瀏覽器導航
//后退
driver.navigate().back();
//前進
driver.navigate().forward();
//刷新
driver.navigate().refresh();
打開網站:
// 更?的?法
driver.navigate().to("https://selenium.dev");
// 簡潔的?法
driver.get("https://selenium.dev");
3.7 彈窗
彈窗不屬于web頁面元素,所以就沒辦法定位元素,這里就要使用Alert類
Alert alert = driver.switchTo.alert();
//確認
alert.accept()
//取消
alert.dismiss()
3.8 文件上傳
WebElement ele = driver.findElement(By.cssSelector("body > div > div >
input[type=file]"));
//輸入文件本地存儲的路徑即可
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
3.9 瀏覽器參數設置
1)"無頭模式",指的是執行自動化的時候不會打開網頁
options.addArguments("-headless");
