selenium進行自動化測試的一個很重要的東西那就是元素定位,如果元素都沒法定位就無法操作它,也就無法進行自動化測試了。網上對於元素定位有很多的介紹,很詳細很詳細的,但是依然有很多新手總是會遇到無法定位的情況,在這里自己總結下元素定位。
先來看元素定位的方式
//使用id定位 userName = driver.findElement(By.id("TANGRAM__PSP_8__userName")); //使用class定位 userName = driver.findElement(By.className("pass-text-input pass-text-input-userName")); //使用name定位 userName = driver.findElement(By.name("userName")); //使用xpath定位 //絕對路徑 userName = driver.findElement(By.xpath("/html/body/div[6]/div[2]/div[2]/div/div/div/div/div/div[1]/form/p[5]/input")); //使用元素屬性值定位 userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userName']")); //或者先定位父層級元素 userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userNameWrapper']/input")); //使用邏輯運算符 userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userName' and @name='userName']")); //contains 包含某個屬性 userName = driver.findElement(By.xpath("//input[contains(@id,'TANGRAM__PSP_8__userName')]"));
漏了一種還有css定位,一般來說在項目中用xpath和css基本能定位所有元素了,但是從效率上來講的話還是css比較高。個人比較喜歡用xpath定位,id、class、name、tagname等等這些容易出現定位不到的情況,並且有些元素的屬性還是動態變化的,如果用這些定位方法來定位的話容易出錯。就拿xpath來說吧,當我們出現一個元素定位不到的時候該怎么處理呢?我說下我的思路:
1.查看html,看下這個元素是否被包在iframe等框架中,如果是有框架的話是需要切換框架的,以163郵箱登陸為例:
<html style="display: block;"> <head> <body class=" move" style="padding-top: 0px;"> <header class="header"> <section id="mainBg" class="main" style="background-color: rgb(249, 249, 249);"> <div id="mainCnt" class="main-inner" style="background-image: url("http://mimg.127.net/m/lc/img/LoginBackgroundPic/1061/2/promPic.jpg");"> <div id="loginBlock" class="login tab-2"> <div class="loginFunc"> <div id="appLoginTab" class="loginForm"> <div id="normalLoginTab" class="loginForm"> <div class="loginWrap"> <div id="loginDiv" class="loginUrs" style="width: 295px; height: 413px;"> <iframe id="x-URS-iframe" frameborder="0" name="" scrolling="no" style="width: 100%; height: 100%; border: medium none; background: none repeat scroll 0% 0% transparent;" src="http://dl.reg.163.com/webzj/m163_1.0.1/pub/index_dl.html?wdaId="> <!DOCTYPE html> <html> <head> <body> <div id="confirm" class="m-confirm f-dn"> <div id="cnt-box-parent" class="g-bd cnt-box-include"> <div id="loading" class="loading f-dn"> <div id="cnt-box" class="g-bd"> <div class="m-header"> <div class="m-cnt"> <form id="login-form"> <div id="auto-id-1482585786268" class="m-container"> <div id="account-box" class="inputbox"> <div class="u-logo"> <div id="auto-id-1482585786267" class="u-input box"> <label id="auto-id-1482585786237" class="u-label f-dn" style="display: block;">郵箱帳號或手機號</label> <input id="auto-id-1482585786223" class="j-inputtext dlemail" type="text" spellcheck="false" tabindex="1" autocomplete="off" data-required="true" data-type="email" name="email" data-placeholder="郵箱帳號或手機號" placeholder="郵箱帳號或手機號" style="width: 122px;">
可以看到賬號輸入框是在一個iframe框架中的,我們必須要切換框架才能定位到賬號輸入框,如何切換呢,很簡單,定位iframe,然后切換
WebElement frame = dr.findElement(By.xpath("//*[@id='x-URS-iframe']"));
dr.switchTo().frame(frame);
2.如果是沒有框架呢,還是定位不到,對了還要注意看報錯信息,是無法定位到這個元素還是這個元素是不可見的。我們進行自動化測試的時候容易有個誤區,就是想當然的以自己的邏輯去進行一個操作,而忽略了程序本身對這個邏輯的處理。舉個例子,我們登陸的時候需要先點擊登陸按鈕,彈出登錄小窗口再進行登陸。有的童鞋就直接定位賬號密碼輸入框,自動化嘛,怎么簡單怎么來,這當然是不行的。再寫腳本的時候一定要注意,手工怎么點的,腳本就怎么寫,怎么一步步執行,都不能漏。如果不能定位到元素就看下是不是對這個元素進行定位之前漏掉了什么操作。
3.定位的時候不要過分的相信自己寫的代碼。例如我寫了個下面的定位,怎么檢查代碼都沒有問題就是定位不到。這個時候就不要急,先查出是這個元素本身的問題還是寫的代碼的問題,使用另外一種定位方式再進行定位確定是不是自己定位寫的有問題。我在群里經常看到許多童鞋粘上自己的代碼就說寫的沒問題啊怎么就是定位不到,然后群里的熱心朋友給他重寫了個定位,他滿心歡喜的一試,呀可以了就不了了之了,不從自身找下為什么定位不到的原因。
userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userNameWrapper']/input"));
4.當元素結構比較復雜的時候,學會靈活運用定位方式,像多利用這種包涵的定位方式可以更好的解決問題。
//contains 包含某個屬性
userName = driver.findElement(By.xpath("//input[contains(@id,'TANGRAM__PSP_8__userName')]"));
總之元素定位是不難的,要多練,定位不到自己解決,自己反思是哪里出的問題,這樣才能提高自己。