一、定位元素的方法
- id:首選的識別屬性,W3C標准推薦為頁面每一個元素設置一個獨一無二的ID屬性,
如果沒有且很難找到唯一屬性,解決方法:(1)找開發把id或者name加上。如果不行,解決思路可以是:
1. 找到該按鈕的特征,例如按鈕的文字是 submit;
2. 用XPath定位,可以這樣寫://button[@value='submit']。(注意是單引號!!)
- name:和id一致
- ClassName:對某些具有相同類的元素一網打盡的好方法
- link text 和 partial link text: 用在定位超鏈接上比較多
- tag name:與class name有點類似,但是結果多個,多用List顯示:
findElement和findElements的區別:
findElement返回一個元素對象,否則拋出異常。
findElements返回符合條件的元素List,如果不存在符合條件的元素就返回一個空的List。
View Code
- css selector:熟悉jQuery比較容易定位到,可見 http://saucelabs.com/resources/selenium/css-selectors 。#為class,.為name
- jQuery:即使用js來執行查詢定位,調用JavascriptExecutor類來執行jQuery的find()方法來查找元素,可參照
博主 http://www.cnblogs.com/tobecrazy/p/4817946.html 寫的相當詳細
- xpath:以上方式都定位不到的都可以用這種方法,但是記得優化路徑,而不是。。。 /html/body/div/div[2]/div[2]/div[2]/div[5]/div/p[2]......性能很差的好么!
xpath缺點:
1. 性能差,定位元素的性能比起大多數其他方法要差;
2. 不夠健壯,XPath會隨着頁面元素布局的改變而改變,可讀性差,幾乎不能維護
xpath優點:
1. XPath可以通過某個元素找到它的祖先(Ancestors)(”/../” 或者 “ancestor-or-self::book”);
2. 可以做布爾邏輯判斷,例如/button[@value=’submit’ or @name=’tijiao’]
二、如何用xpath定位:
定位路徑可以是相對路徑,也可以是絕對路徑。絕對定位路徑以一個斜線“/”開頭,而相對定位路徑則沒有。如:/div/input 和 div/input
第一種方法:通過絕對路徑做定位
By.xpath("html/body/div/form/input")
By.xpath("//input")
第二種方法:通過元素索引定位
By.xpath("//input[4]")
第三種方法:使用xpath屬性定位(結合第2、第3中方法可以使用),前面用:tagName [@ 屬性='屬性值'] 表示
By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and @name='kw1']")
第四種方法:使用部分屬性值匹配(最強大的方法)
By.xpath("//input[start-with(@id,'nice')
By.xpath("//input[ends-with(@id,'很漂亮')
By.xpath("//input[contains(@id,'那么美')]")
三、定位頁面元素常見的問題
1.元素顯示有id,但是就是定位不到(不知道為什么,咨詢某個群主說是定位原理不一樣)換定位方式,如name,xpath,!!!!
2.未設置等待時間,未找到元素前就執行操作,導致報錯,解決方法:
(1)顯示等待:就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那么就跳出Exception
new WebDriverWait(driver, 15).until( ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator")) );
或者可以這樣寫
WebDriver driver = new FirefoxDriver(); driver.get( http://somedomain/url_that_delays_loading);
WebElement e = (new WebDriverWait( driver, 10)) .until( new ExpectedCondition< WebElement>(){ //等10秒直到找到id元素
@Override public WebElement apply( WebDriver d) { return d.findElement( By.id("id locator")); } } );
(2)WebDriver會進行一個隱式等待,但參數只有時間,這就導致我需要什么元素出現,我不一定能等到它,只是讓driver延遲一段時間再繼續而已.
隱式等待 driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
不過我們也可以把它小小的封裝一下:
public boolean isByElementDisplayed(By by, int time) { boolean status = false; if (driver.findElement(by).isDisplayed() == false) { driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS); } else { status = true; } return status; }
(3)線程休眠: Thread.sleep(3000);
3.動態id,建議使用xpath的相對路徑定位
4.輸入框和按鈕組合,輸入框輸入后沒有失去焦點,層級覆蓋,導致找不到按鈕,設置等待即可!!!!!!
5.iframe框架,時間控件和地圖選擇控件后續介紹!!!
6.富文本編輯框,內嵌html,如 UEeditor,可使用js,絕對管用
String text = "你好呀"; String js = "document.getElementById('ueditor_0').contentDocument.write('" + text + "');"; ((JavascriptExecutor) driver).executeScript(js);
7.最揪心的是模態窗口不知道是個什么鬼。首先不是新開一個窗口,不能用windowshandle定位,另外也沒有用iframe框架,再者也不屬於彈出框,不能用switchTo去處理,所以這個需要后期請教大神了解。
基本了解到的就這些啦!