在學習 Web 自動化測試的過程中,selenium 是其中的常用工具。除了其開源免費,包含豐富的 API 以外,它還支持多瀏覽器,多系統(tǒng),多語言等等優(yōu)點
一、環(huán)境準備
這里將使用Java
語言,在谷歌瀏覽器(Chrome)
下來進行 selenium 工具的使用。
想要開展自動化測試,首先要保證環(huán)境已經(jīng)部署到位,包括 selenium 工具包,Chrome瀏覽器,Webdriver(Chromedriver 谷歌驅(qū)動),java版本至少為8
關(guān)于 selenium 工具包
,在我們創(chuàng)建好一個 Maven 項目之后,就需要在 pom.xml 中引入依賴。完成后,一定要點開界面右上角的 Maven 按鈕,點擊刷新按鈕進行刷新
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
Chrome 瀏覽器記得在官方網(wǎng)頁下載就行。
由于使用的是 Chrome 瀏覽器,那么我們使用的驅(qū)動得是谷歌驅(qū)動(Chromedriver)
,這個驅(qū)動的作用就是協(xié)助打開 Chrome 瀏覽器的,因為代碼是沒有辦法自己直接打開瀏覽器,進行一系列操作的。
下載驅(qū)動的具體操作呢,首先要先查看一下 Chrome 瀏覽器的版本,瀏覽器右上角的三個點 ?? 幫助? ?? 關(guān)于 Google Chrome
然后,進入下面的地址,選擇與 Chrome 版本最接近的版本,點進去,下載驅(qū)動
鏈接:Chromedriver
下載完成后,將 chromedriver.exe 放到 C:\Program Files\Java\jdk1.8.0_192\bin 目錄下(默認情況下)
PS:最好停止瀏覽器自動更新的功能,不然版本更新后,又需要下載新的驅(qū)動
具體操作,控制面板 ?? 管理工具 ?? 服務(wù) ?? ?Google更新服務(wù)禁用(右擊屬性設(shè)置)
二、Web 自動化測試 Demo
主要內(nèi)容就是打開瀏覽器,打開百度網(wǎng)頁,在搜索框中輸入搜索關(guān)鍵詞,點擊 “百度一下“ 搜索按鈕,查看到搜索結(jié)果內(nèi)容,關(guān)閉瀏覽器
public class Test1 {
//創(chuàng)建出一個驅(qū)動對象來
private ChromeDriver driver = new ChromeDriver();
//自動化測試前必須的操作:打開網(wǎng)址
public void startTest() {
driver.get("https://www.baidu.com/");
}
public void demoTest() throws InterruptedException {
Thread.sleep(1000);//等待1秒,為了更方便的查看測試狀態(tài)
//找到 id 為 "kw" 的元素(百度輸入框),然后往該元素中填充搜索詞 "巴巴"
driver.findElement(By.id("kw")).sendKeys("巴巴");
Thread.sleep(1000);
//找到 id 為 "su" 的元素('百度一下'按鈕),然后點擊一下
driver.findElement(By.id("su")).click();
Thread.sleep(1000);
}
//自動化測試后必須的操作:釋放掉驅(qū)動對象,瀏覽器關(guān)閉
public void endTest() {
driver.quit();
}
}
調(diào)用測試方法類
public class RunTest {
public static void main(String[] args) throws InterruptedException {
Test1 test1 = new Test1();
test1.startTest(); //測試準備
test1.demoTest(); //測試 ing
test1.endTest(); //測試收尾
}
}
三、元素定位常用方法
在上面的測試 Demo 中就已經(jīng)舉例出了一種元素定位方法——By.id()【通過id
】
除此外還有通過 cssSelector,xpath,tagName,className,name,partialLinkText,linkText
//一、id 定位(全局唯一,可定位成功)
driver.findElement(By.id("kw"));
//二、cssSelector 定位(唯一,可定位成功)
driver.findElement(By.cssSelector("#kw"));
//三、xpath 定位(唯一,可定位成功)
driver.findElement(By.xpath("http://*[@id=\"kw\"]"));
//四、tagName 定位(標簽名不唯一性大,定位失敗率高)
driver.findElement(By.tagName("input"));
//五、className 定位(不唯一性大,定位失敗率高)
driver.findElement(By.className("s_ipt"));
//六、name 定位(有定位失敗的可能)
driver.findElement(By.name("wd"));
//七、linkText 定位(鏈接名定位)
driver.findElement(By.linkText("hao123"));
//八、partialLinkText 定位(部分鏈接名定位)
driver.findElement(By.partialLinkText("123"));
定位元素時,一定要保證元素能夠找到且唯一,否則定位失敗
四、元素定位失敗可能原因
原因一:定位的方式不唯一,或者根本就沒與該元素
檢查該元素是否可定位,可通過F12的console標簽通過document.querySelector() 的方法定位,可驗證是否能找到元素
原因二:如果使用 cssSelector 或者 xpath 的話,其定位方式錯誤
按下F12,ctrl+f,把要檢查的 cssSelector 輸入,看能否只定位到一個元素。
原因三:頁面還沒有加載完成,就開始定位元素
一般來說,代碼執(zhí)行的速度比頁面渲染速度要快。代碼執(zhí)行到了,但目標元素在頁面中還沒有渲染出來導致沒法定位到目標元素,因此需要合理使用元素等待
原因四:元素沒有達到可見的條件
比如目標元素需要鼠標懸?;蛘邌螕繇撁嫔系哪硞€元素或者需要需要滾動條下拉才能找到。或者還有可能,需要定位的元素在新的窗口中,但是還沒有打開新的窗口,需要切換到新窗口才可以找到目標元素。還有可能某些元素本來就是不可見的,比如 display 屬性為 none,這就需要通過 JavaScript 修改 display 的值
原因五:存在表單嵌套
順著定位元素往上找,查看是否有 <iframe> 標簽,找到說明要定位此元素,需先切換到此表單,再定位元素。
五、測試對象操作
5.1 click 點擊對象
driver.findElement(By.partialLinkText("123")).click();
5.2 send_keys 按鍵輸入
driver.findElement(By.id("kw")).sendKeys("巴巴");
5.3 clear 清除輸入
driver.findElement(By.id("kw")).clear();
5.4 submit 提交表單
driver.findElement(By.id("su")).submit();
click 和 submit 都可以操作按鈕,不同的是,click 可以點擊頁面中的任何元素,但可以 click 的地方不一定可以 submit ,所以一般使用 click 就行
5.5 getText 文本獲取
String str = driver.findElement(By.partialLinkText("123")).getText();
System.out.println(str);
獲取的文本是不包含在標簽內(nèi)的,標簽中的 value 值指的是 value 的屬性值
5.6 getAttribute 屬性值獲取
String str1 = driver.findElement(By.id("su")).getAttribute("type");
String str2 = driver.findElement(By.id("su")).getAttribute("value");
String str3 = driver.findElement(By.id("su")).getAttribute("id");
String str4 = driver.findElement(By.id("su")).getAttribute("class");
System.out.println("type:"+str1+" value:"+str2+" id:"+str3+" class:"+str4);
六、等待操作
在元素定位失敗的原因中有提到過,代碼的執(zhí)行速度比頁面渲染的速度快,如果目標元素還沒渲染出來,代碼就已經(jīng)執(zhí)行到了,就會導致找不到目標元素,所以等待的操作是非常有必要的
強制等待
Thread.sleep(1000);
參數(shù)是強制等待的時間,單位是毫秒,用法非常簡單。指定多少時間就會讓程序暫停多少時間,等待時間結(jié)束后才會繼續(xù)執(zhí)行下一步,方便調(diào)試查看測試過程。但固定的等待時間導致測試時間過長,降低測試效率
隱式等待
public void waitTest() {
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
//隱式等待,設(shè)置等待的時間為 2,單位為秒
driver.findElement(By.id("kw")).sendKeys("狗狗");
driver.findElement(By.id("su")).click();
driver.findElement(By.xpath("http://*[@id=\"5\"]/div/div/h3/a")).click();
}
隱式等待指的是在自己設(shè)置的這段時間內(nèi),不停的等待目標元素出現(xiàn),如果在時間范圍內(nèi)始終沒有出現(xiàn),就會拋出找不到元素異常(NoSuchElementException)。并且隱式等待作用范圍為整個 Webdriver 生命周期
,所以放在哪里影響不大,只要沒退出瀏覽器就一直存在。
和強制等待相比,無疑是節(jié)省了很多的時間
顯示等待
隱式等待有個缺點,那就是需要等待所有的元素都展現(xiàn)出來了才會執(zhí)行下一步。與之相比,顯示等待的優(yōu)點就是針對某個元素進行等待,不需要等到所有元素都渲染好,目標元素出現(xiàn)就可以結(jié)束了,進一步提高測試效率,但是寫法相較于前兩種來說更為復雜。文章來源:http://www.zghlxwxcb.cn/news/detail-816435.html
public void waitTest() {
driver.findElement(By.id("kw")).sendKeys("狗狗");
driver.findElement(By.id("su")).click();
//創(chuàng)建一個顯示等待的對象,初始化時傳入兩個參數(shù),一個是驅(qū)動對象,另一個是等待時間
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));
//在規(guī)定時間內(nèi)不停尋找目標元素
//結(jié)束的契機就是until括號內(nèi)的條件滿足,即目標元素已經(jīng)被找到了,沒找到就拋出異常
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("http://*[@id=\"5\"]/div/div/h3/a"))).click();
}
PS:隱式等待和顯示等待不要放在一起使用
,不然實際等待的時間將沒有辦法預期文章來源地址http://www.zghlxwxcb.cn/news/detail-816435.html
七、信息打印
public void printTest() {
String title = driver.getTitle(); //獲取網(wǎng)址標題
String url = driver.getCurrentUrl(); //獲取網(wǎng)址 url
System.out.println("title:"+title+" url:"+url);
}
到了這里,關(guān)于Web自動化測試——selenium篇(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!