1、定位元素的方法css
若是沒有且很難找到惟一屬性,解決方法:(1)找開發把id或者name加上。若是不行,解決思路能夠是:html
1. 找到該按鈕的特徵,例如按鈕的文字是 submit;sql
2. 用XPath定位,能夠這樣寫://button[@value='submit']。(注意是單引號!!)windows
findElement和findElements的區別:app
findElement返回一個元素對象,不然拋出異常。框架
findElements返回符合條件的元素List,若是不存在符合條件的元素就返回一個空的List。dom
博主 http://www.cnblogs.com/tobecrazy/p/4817946.html 寫的至關詳細ide
xpath缺點:佈局
1. 性能差,定位元素的性能比起大多數其餘方法要差;性能
2. 不夠健壯,XPath會隨着頁面元素佈局的改變而改變,可讀性差,幾乎不能維護
xpath優勢:
1. XPath能夠經過某個元素找到它的祖先(Ancestors)(」/../」 或者 「ancestor-or-self::book」);
2. 能夠作布爾邏輯判斷,例如/button[@value=’submit’ or @name=’tijiao’]
2、如何用xpath定位:
定位路徑能夠是相對路徑,也能夠是絕對路徑。絕對定位路徑以一個斜線「/」開頭,而相對定位路徑則沒有。如:/div/input 和 div/input
第一種方法:經過絕對路徑作定位
By.xpath("html/body/div/form/input")
By.xpath("//input")
第二種方法:經過元素索引定位
By.xpath("//input[4]")
第三種方法:使用xpath屬性定位(結合第二、第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,'那麼美')]")
3、定位頁面元素常見的問題
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去處理,因此這個須要後期請教大神瞭解。
基本瞭解到的就這些啦!