Java利用Selenium操作瀏覽器的示例詳解
簡(jiǎn)介
本文主要介紹如何使用java代碼利用Selenium操作瀏覽器,某些網(wǎng)頁(yè)元素加載慢,如何操作元素就會(huì)把找不到元素的異常,此時(shí)需要設(shè)置元素等待,等待元素加載完,再操作。
設(shè)置元素等待
很多頁(yè)面都使用 ajax 技術(shù),頁(yè)面的元素不是同時(shí)被加載出來(lái)的,為了防止定位這些尚在加載的元素報(bào)錯(cuò),可以設(shè)置元素等來(lái)增加腳本的穩(wěn)定性。webdriver 中的等待分為 顯式等待 和 隱式等待。
顯式等待
顯式等待:設(shè)置一個(gè)超時(shí)時(shí)間,每個(gè)一段時(shí)間就去檢測(cè)一次該元素是否存在,如果存在則執(zhí)行后續(xù)內(nèi)容,如果超過(guò)最大時(shí)間(超時(shí)時(shí)間)則拋出超時(shí)異常(TimeoutException)。顯示等待需要使用 WebDriverWait,同時(shí)配合 until 或 not until 。下面詳細(xì)講解一下。
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
/**
* @author Lenovo
*/
public class SeleniumDemo {
private final static String webDriver = "webdriver.chrome.driver";
private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";
public static void main(String[] args) throws InterruptedException {
System.setProperty(webDriver, webDriverPath);
WebDriver driver= new ChromeDriver();
//博客主頁(yè)
driver.get("https://blog.csdn.net/weixin_40986713");
WebElement element=driver.findElement(By.className("submit"));
long start=System.currentTimeMillis();
//等待5秒
WebDriverWait shortWait = new WebDriverWait(driver, 5);
//5秒內(nèi)元素加載出來(lái)就執(zhí)行點(diǎn)擊
shortWait.until(ExpectedConditions.elementToBeClickable(element)).click();
//忽略找不到元素異常
shortWait.ignoring(NoSuchElementException.class);
System.out.println("耗時(shí) "+(System.currentTimeMillis()-start)+" ms");
}
}- until 指定預(yù)期條件的判斷方法,在等待期間,每隔一段時(shí)間調(diào)用該方法,判斷元素是否存在,直到元素出現(xiàn)。
- ignoring 指定忽略的異常,如果設(shè)定的執(zhí)行等待超時(shí)的時(shí)間段內(nèi),忽略指定的異常,讓程序繼續(xù)進(jìn)行。
隱式等待
隱式等待也是指定一個(gè)超時(shí)時(shí)間,如果超出這個(gè)時(shí)間指定元素還沒(méi)有被加載出來(lái),就會(huì)拋出 NoSuchElementException 異常。
除了拋出的異常不同外,還有一點(diǎn),隱式等待是全局性的,即運(yùn)行過(guò)程中,如果元素可以定位到,它不會(huì)影響代碼運(yùn)行,但如果定位不到,則它會(huì)以輪詢的方式不斷地訪問(wèn)元素直到元素被找到,若超過(guò)指定時(shí)間,則拋出異常。
使用 driver.manage().timeouts().implicitlyWait() 來(lái)實(shí)現(xiàn)隱式等待,使用難度相對(duì)于顯式等待要簡(jiǎn)單很多。
示例:打開(kāi)個(gè)人主頁(yè),設(shè)置一個(gè)隱式等待時(shí)間 5s,通過(guò) id 定位一個(gè)不存在的元素,最后打印 拋出的異常 與 運(yùn)行時(shí)間。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
/**
* @author Lenovo
*/
public class SeleniumDemo {
private final static String webDriver = "webdriver.chrome.driver";
private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";
public static void main(String[] args) throws InterruptedException {
System.setProperty(webDriver, webDriverPath);
WebDriver driver= new ChromeDriver();
//博客主頁(yè)
driver.get("https://blog.csdn.net/weixin_40986713");
//設(shè)置全局隱式等待
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
long start=System.currentTimeMillis();
try {
driver.findElement(By.className("tarzan"));
}catch (Exception e){
System.out.println(e);
System.out.println("耗時(shí) "+(System.currentTimeMillis()-start)+" ms");
}
}
}
代碼運(yùn)行到 driver.findElement(By.className("tarzan"));這句之后觸發(fā)隱式等待,在輪詢檢查 5s 后仍然沒(méi)有定位到元素,拋出異常。

強(qiáng)制等待
用java代碼強(qiáng)制當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)
使用 time.sleep() 強(qiáng)制等待,設(shè)置固定的休眠時(shí)間,對(duì)于代碼的運(yùn)行效率會(huì)有影響。
以上面的例子作為參照,將 隱式等待 改為 強(qiáng)制等待。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
/**
* @author Lenovo
*/
public class SeleniumDemo {
private final static String webDriver = "webdriver.chrome.driver";
private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";
public static void main(String[] args) throws InterruptedException {
System.setProperty(webDriver, webDriverPath);
WebDriver driver= new ChromeDriver();
//博客主頁(yè)
driver.get("https://blog.csdn.net/weixin_40986713");
long start=System.currentTimeMillis();
//等待5s
Thread.sleep(5000);
try {
driver.findElement(By.className("tarzan"));
}catch (Exception e){
System.out.println(e);
System.out.println("耗時(shí) "+(System.currentTimeMillis()-start)+" ms");
}
}
}
值得一提的是,對(duì)于定位不到元素的時(shí)候,從耗時(shí)方面隱式等待和強(qiáng)制等待沒(méi)什么區(qū)別。但如果元素經(jīng)過(guò) 2s 后被加載出來(lái),這時(shí)隱式等待就會(huì)繼續(xù)執(zhí)行下面的代碼,但 sleep還要繼續(xù)等待 3s。
總結(jié)
推薦使用的隱式等待,也就是implicitlyWait。
理由:
使用implicitlyWait或者明確等待(explicitly wait),方法參數(shù)是等待的最大時(shí)長(zhǎng)。
也就是只要一找到元素,就會(huì)立刻執(zhí)行下一行代碼,不會(huì)強(qiáng)制等待參數(shù)里設(shè)置的時(shí)間。
而第三種(線程休眠)則不同,會(huì)強(qiáng)制等待設(shè)置的時(shí)間。設(shè)想一下,如果你的工程有好幾百個(gè)case,
需要等待的元素都采用第三種,會(huì)大大加長(zhǎng)所有case執(zhí)行的時(shí)間,而你又急著要report,豈不是很慘。
使用implicitlyWait,webdriver會(huì)自動(dòng)應(yīng)用到case中的所有element中。在啟動(dòng)瀏覽器(driver.get)之后設(shè)置上,這樣就不用針對(duì)某個(gè)元素去設(shè)置了,簡(jiǎn)直太方便了,不過(guò)有些特殊的元素,確實(shí)等待時(shí)間較長(zhǎng)的,可以再采用explicit wait。
如果implicitlyWait和explicitly wait都在用在代碼里,那么最大等待時(shí)間不是兩個(gè)時(shí)間的疊加,而是取最大值。
到此這篇關(guān)于Java利用Selenium操作瀏覽器的示例詳解的文章就介紹到這了,更多相關(guān)Java Selenium操作瀏覽器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)n位數(shù)字的全排列
今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)n位數(shù)字的全排列,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Java中Collection集合常用API之?Collection存儲(chǔ)自定義類型對(duì)象的示例代碼
Collection是單列集合的祖宗接口,因此它的功能是全部單列集合都可以繼承使用的,這篇文章主要介紹了Java中Collection集合常用API?-?Collection存儲(chǔ)自定義類型對(duì)象,需要的朋友可以參考下2022-12-12
java中的日期時(shí)間類Date和SimpleDateFormat
這篇文章主要介紹了java中的日期時(shí)間類Date和SimpleDateFormat,Date類的對(duì)象在Java中代表的是當(dāng)前所在系統(tǒng)的此刻日期時(shí)間,說(shuō)白了就是你計(jì)算機(jī)上現(xiàn)實(shí)的時(shí)間,需要的朋友可以參考下2023-09-09
Mybatis之Select Count(*)的獲取返回int的值操作
這篇文章主要介紹了Mybatis之Select Count(*)的獲取返回int的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
String字符串轉(zhuǎn)BigDecimal時(shí),報(bào)NumberFormatException異常的解決
這篇文章主要介紹了String字符串轉(zhuǎn)BigDecimal時(shí),報(bào)NumberFormatException異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析
這篇文章主要為大家介紹了TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

