高端網(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");
常見操作
查找元素
我們可以通過下面這個(gè)方法查找頁面的一個(gè)元素
driver.findElement(By.cssSelector(""))
該方法返回一個(gè)WebElement元素
例如,我們查找百度的搜索框
WebElement element = driver.findElement(By.cssSelector("#kw"));
也可以通過下面這個(gè)方法查找頁面中多個(gè)元素
findElements()
輸入文本
通過對WebElement元素調(diào)用下面這個(gè)方法來輸入文本
sendKeys();
例如,我們在搜索框中輸入蔡徐坤
driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
點(diǎn)擊click
我們可以通過對WebElement元素調(diào)用下面這個(gè)方法來實(shí)現(xiàn)在網(wǎng)站中點(diǎn)擊該元素
click();
例如我們點(diǎn)擊百度中的百度一下按鈕
driver.findElement(By.cssSelector("#su")).click();
提交submit
我們可以通過對WebElement元素調(diào)用下面這個(gè)方法來實(shí)現(xiàn)提交該表單元素
submit();
例如我們提交百度一下的表單
driver.findElement(By.cssSelector("#su")).submit();
清除clear
我們可以通過對WebElement元素調(diào)用該方法,來實(shí)現(xiàn)清除之前的輸入
clear();
例如,我們可以清除之前在輸入框中的輸入
driver.findElement(By.cssSelector("#kw")).clear();
獲取文本
我們可以對WebElement元素調(diào)用該方法,獲取元素中的文本,最終返回一個(gè)字符串
getText();
例如獲取下面這個(gè)熱搜中的文本,將其打印在控制臺(tái)上
System.out.println(driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(2) > a > span.title-content-title")).getText());
獲取屬性
而如果我們嘗試獲取百度一下按鈕中的文字,會(huì)發(fā)現(xiàn)無法獲取到文字,這是因?yàn)榘俣纫幌率莢alue這個(gè)鍵對應(yīng)的值,我們可以通過調(diào)用下面這個(gè)方法,實(shí)現(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)題
我們可以通過下面這個(gè)方法來獲取當(dāng)前頁面的標(biāo)題,其結(jié)果返回一個(gè)字符串
getTitle();
例如我們將該頁面標(biāo)題打印到控制臺(tái)上
System.out.println(driver.getTitle())
獲取頁面url
這里的內(nèi)容,就是當(dāng)前頁面的url
我們通過下面這個(gè)方法來獲取當(dāng)前頁面的url,其結(jié)果返回一個(gè)字符串
System.out.println(driver.getCurrentUrl())
窗口
調(diào)整窗口大小
將窗口最大化
driver.manage().window().maximize();
將窗口最小化
driver.manage().window().minimize();
將窗口全屏顯示
driver.manage().window().fullscreen();
手動(dòng)設(shè)置窗口大小(第一個(gè)元素是寬度,第二個(gè)元素是高度)
driver.manage().window().setSize(new Dimension(1024,2048));
窗口的切換
如果我們使用自動(dòng)化程序,點(diǎn)擊“圖片”超鏈接,進(jìn)入到百度圖片的頁面,然后獲取百度一下按鈕,就會(huì)發(fā)現(xiàn)結(jié)果報(bào)錯(cuò)了
具體實(shí)現(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();
最終程序報(bào)錯(cuò),沒有找到“百度一下”按鈕
通過回顧剛才的圖片可以看到,我們這時(shí)開了兩個(gè)窗口,而自動(dòng)化程序現(xiàn)在操作的還是第一個(gè)窗口,因此訪問不到百度圖片的“百度一下”
事實(shí)上,每打開一個(gè)標(biāo)簽頁,瀏覽器就會(huì)自動(dòng)給標(biāo)簽頁一個(gè)標(biāo)識(shí):句柄
我們可以通過下面這個(gè)方法獲取所有界面的句柄,其結(jié)果為Set< String >
getWindowHandles();
也可以只獲取當(dāng)前頁面的句柄打印出來
System.out.println(driver.getWindowHandle());
我們可以通過下面這個(gè)操作來獲取所有頁面的句柄,將他們打印出來
Set<String> handles = driver.getWindowHandles();
for (String handle:handles) {System.out.println(handle);
}
可以使用下面這個(gè)方法,傳輸一個(gè)句柄,來切換頁面
driver.switchTo().window(handle);
屏幕截圖
如果我們自動(dòng)化實(shí)現(xiàn)在百度中搜索蔡徐坤,并且點(diǎn)擊下圖中這個(gè)名字
具體代碼如下
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();
最終會(huì)發(fā)現(xiàn)代碼報(bào)錯(cuò),沒有找到該元素
我們可以使用屏幕截圖,看一下當(dāng)前頁面是什么樣子
使用下面的方法,可以將當(dāng)前界面截屏為java中的file對象
getScreenshotAs(OutputType.FILE);
我們可以將file對象拷貝為已有的文件,實(shí)現(xiàn)將屏幕截圖放到指定路徑下的操作
首先導(dǎo)入依賴
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
使用下面這個(gè)代碼,可以實(shí)現(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í)行查找元素了,因此會(huì)發(fā)生找不到的情況
因此,我們只需要加上休眠時(shí)間,讓瀏覽器有時(shí)間渲染即可
讓瀏覽器休眠3秒
Thread.sleep(3000);
可以看到,這時(shí)渲染的畫面是正常的