高端網(wǎng)站開發(fā)建設(shè)網(wǎng)站媒體推廣
selenium的前置準(zhǔn)備工作可以參考我之前的博客:Java測試——selenium的安裝與使用教程
這篇博客講解一下selenium的常見操作
先創(chuàng)建driver
ChromeDriver driver = new ChromeDriver();
輸入網(wǎng)址
driver.get("https://www.baidu.com");
常見操作
查找元素
我們可以通過下面這個方法查找頁面的一個元素
driver.findElement(By.cssSelector(""))
該方法返回一個WebElement元素
例如,我們查找百度的搜索框
WebElement element = driver.findElement(By.cssSelector("#kw"));
也可以通過下面這個方法查找頁面中多個元素
findElements()
輸入文本
通過對WebElement元素調(diào)用下面這個方法來輸入文本
sendKeys();
例如,我們在搜索框中輸入蔡徐坤
driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
點擊click
我們可以通過對WebElement元素調(diào)用下面這個方法來實現(xiàn)在網(wǎng)站中點擊該元素
click();
例如我們點擊百度中的百度一下按鈕
driver.findElement(By.cssSelector("#su")).click();
提交submit
我們可以通過對WebElement元素調(diào)用下面這個方法來實現(xiàn)提交該表單元素
submit();
例如我們提交百度一下的表單
driver.findElement(By.cssSelector("#su")).submit();
清除clear
我們可以通過對WebElement元素調(diào)用該方法,來實現(xiàn)清除之前的輸入
clear();
例如,我們可以清除之前在輸入框中的輸入
driver.findElement(By.cssSelector("#kw")).clear();
獲取文本
我們可以對WebElement元素調(diào)用該方法,獲取元素中的文本,最終返回一個字符串
getText();
例如獲取下面這個熱搜中的文本,將其打印在控制臺上
System.out.println(driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(2) > a > span.title-content-title")).getText());
獲取屬性
而如果我們嘗試獲取百度一下按鈕中的文字,會發(fā)現(xiàn)無法獲取到文字,這是因為百度一下是value這個鍵對應(yīng)的值,我們可以通過調(diào)用下面這個方法,實現(xiàn)獲取WebElement元素相應(yīng)的鍵對應(yīng)的值,其結(jié)果為字符串
getAttribute();
例如,我們可以獲取輸入框的相關(guān)鍵對應(yīng)的值
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("value"));
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("id"));
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("class"));
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("type"))
獲取頁面標(biāo)題
這里的“百度一下,你就知道”,就是我們當(dāng)前頁面的標(biāo)題
我們可以通過下面這個方法來獲取當(dāng)前頁面的標(biāo)題,其結(jié)果返回一個字符串
getTitle();
例如我們將該頁面標(biāo)題打印到控制臺上
System.out.println(driver.getTitle())
獲取頁面url
這里的內(nèi)容,就是當(dāng)前頁面的url
我們通過下面這個方法來獲取當(dāng)前頁面的url,其結(jié)果返回一個字符串
System.out.println(driver.getCurrentUrl())
窗口
調(diào)整窗口大小
將窗口最大化
driver.manage().window().maximize();
將窗口最小化
driver.manage().window().minimize();
將窗口全屏顯示
driver.manage().window().fullscreen();
手動設(shè)置窗口大小(第一個元素是寬度,第二個元素是高度)
driver.manage().window().setSize(new Dimension(1024,2048));
窗口的切換
如果我們使用自動化程序,點擊“圖片”超鏈接,進(jìn)入到百度圖片的頁面,然后獲取百度一下按鈕,就會發(fā)現(xiàn)結(jié)果報錯了
具體實現(xiàn)代碼如下:
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
driver.findElement(By.cssSelector("#homeSearchForm > span.s_btn_wr > input"));
driver.quit();
最終程序報錯,沒有找到“百度一下”按鈕
通過回顧剛才的圖片可以看到,我們這時開了兩個窗口,而自動化程序現(xiàn)在操作的還是第一個窗口,因此訪問不到百度圖片的“百度一下”
事實上,每打開一個標(biāo)簽頁,瀏覽器就會自動給標(biāo)簽頁一個標(biāo)識:句柄
我們可以通過下面這個方法獲取所有界面的句柄,其結(jié)果為Set< String >
getWindowHandles();
也可以只獲取當(dāng)前頁面的句柄打印出來
System.out.println(driver.getWindowHandle());
我們可以通過下面這個操作來獲取所有頁面的句柄,將他們打印出來
Set<String> handles = driver.getWindowHandles();
for (String handle:handles) {System.out.println(handle);
}
可以使用下面這個方法,傳輸一個句柄,來切換頁面
driver.switchTo().window(handle);
屏幕截圖
如果我們自動化實現(xiàn)在百度中搜索蔡徐坤,并且點擊下圖中這個名字
具體代碼如下
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
driver.findElement(By.cssSelector("#su")).click();
driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span"));
driver.quit();
最終會發(fā)現(xiàn)代碼報錯,沒有找到該元素
我們可以使用屏幕截圖,看一下當(dāng)前頁面是什么樣子
使用下面的方法,可以將當(dāng)前界面截屏為java中的file對象
getScreenshotAs(OutputType.FILE);
我們可以將file對象拷貝為已有的文件,實現(xiàn)將屏幕截圖放到指定路徑下的操作
首先導(dǎo)入依賴
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
使用下面這個代碼,可以實現(xiàn)拷貝文件操作
FileUtils.copyFile(源文件, 目標(biāo)文件);
完整代碼如下:
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
driver.findElement(By.cssSelector("#su")).click();File srcFile = driver.getScreenshotAs(OutputType.FILE);
//將屏幕截圖放到指定路徑下
String filename = "my.png";
FileUtils.copyFile(srcFile, new File(filename));driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span"));
driver.quit();
加上上述代碼,我們看一下瀏覽器當(dāng)前的樣子
可以發(fā)現(xiàn),瀏覽器還沒有渲染完畢,我們的代碼就開始執(zhí)行查找元素了,因此會發(fā)生找不到的情況
因此,我們只需要加上休眠時間,讓瀏覽器有時間渲染即可
讓瀏覽器休眠3秒
Thread.sleep(3000);
可以看到,這時渲染的畫面是正常的