Selenium基本用法以及元素定位

1、Selenium 簡介

  Selenium是ThroughtWorks公司一個強大的開源Web功能測試工具系列,提供一套測試函數,用於支持Web自動化測試。函數很是靈活,可以完成界面元素定位、窗口跳轉、結果比較。他支持IE、Firefox、Safari、Chrome、Android手機瀏覽器,也支持Java、C#、Python、Ruby、PHP等語言,支持如Windows、Linux、IOS、Android等操做系統,是一套爲web自動化測試量身定製的web框架, Selenium框架由多個工具組成,包括:Selenium IDE,Selenium RC,Selenium WebDriver和SeleniumRC,至於他們的功能和做用請你們自行百度腦補,下面將重點介紹selenium主要功能WebDriver。css

2、selenium基本功能

  一、瀏覽器並打開指定網頁html

  WebDriver driver = newChromeDriver();//初始化Google瀏覽器對象程序員

  WebDriver driver = newFirefoxDriver();//初始化火狐瀏覽器web

  WebDriver driver = new InternetExplorerDriver();//初始化IE瀏覽器瀏覽器

  driver.get(「www.baidu.com」)//打開百度頁面框架

  driver.close();//關閉當前頁面函數

  driver.quit();//關閉由selenium所啓動的全部頁面工具

  備註:有些瀏覽器好比火狐並無安裝在默認路徑,那麼須要指定瀏覽器路徑:System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");性能

  二、瀏覽器操做  學習

  driver.navigate().back();//返回或向前
  driver.navigate().forward();//向後
  driver.navigate().refresh();//刷新
  driver.manage().window().maxsize();//最大畫窗口 

  String title = driver.getTitle(); //返回當前頁面的Ttile
  String currentUrl = driver.getCurrentUrl(); //返回當前頁面的url
  getPageSource() //返回當前頁面的源碼
  getWindowHandle() //返回當前的瀏覽器的窗口句柄
  getWindowHandles() //返回當前的瀏覽器的全部窗口句柄

  備註:對於句柄等的介紹後續會有詳細篇幅進行介紹,此處不作贅述

3、基本元素定位

 a、元素定位: 

 例子:

  <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba sb_bs"><span id="gbqfsa">Google Search</span></button>

  一、By.id(id) //用惟一屬性id來定位很是推薦使用 優先級最高
  二、By.name(name) //用name屬性來定位也是很是高效的優先級僅次於id
  三、By.linkText(linkText) //即經過超文本連接上的"文字信息"來定位元素,這種方式通常專門用於定位頁面上的超文本連接:通常tag爲<a>屬性href=連接
  四、By.partialLinkText(linkText) //適用於連接類的元素,模糊匹配,即包含herf屬性的元素 ,同BylinkText()
  五、By.className(className)) //對於元素的屬性包含class的狀況適用 <class = "src">
  六、By.tagName(name) //通用定位方式,適用於層級定位,好比button就是一個tag 所以通常都會找出多條記錄,須要在進行定位,一般用for循環

  以上均爲單元素定位,固然6通常定位的結果都是多個,其餘的通常結果爲1個。單元素定位的命令基本格式以下:

  WebElemet element = driver.findElement(By.id("imageField"));

  element.click();//點擊

  element.sendKeys("String");//輸入

  備註:有一個現象,就是複合類,即例子中的class="gbqfba sb_bs">,若是用driver.findElement(By.id("gbqfba sb_bs"))必定會報錯,這種複合類必須用前面的或者後面的鍵值才能定位成功,即:driver.findElement(By.id("sb_bs"))or driver.findElement(By.id("gbqfba")),不然會報錯,可是注意,若是class="gbqfba:sb_bs">這不是符合類,能夠自行腦補一下css

 b、多元素定位:

  多元素定位實際上是指定位的元素返回多個結果,通常會用List集合來存儲結果,用for循環和if判斷語句來找到本身須要的元素,好比用tagName定位,返回的結果就會多個以下:  

  List<WebElement> allInputs = driver.findElements(By.tagName("input"));//定位tagName爲input的tag元素
  for(WebElement element :allInputs){
    if(element.getAttribute("type").equals("text")){
      System.out.println(e.getText().toString()); //打印出每一個文本框裏的值
    }
  }

 c、層級定位

  層級定位,顧名思義,就按照層級關係進行定位,通常是應用於沒法直接定位到須要定位的元素,因此採用先定位其父元素,在定位子元素的方式,通常用於表格或下拉框定位:

  表格應用

  WebElement table = driver.findElement(By.id("table"));

  List <WebElement> rows  = table.findElement(By.id("tr"));

  下拉框應用

  WebElement select = driver.findElement(By.name("select")); //

  List<WebElement> selectvalue = a.findElements(By.tagName("option"));

  for(WebElement value : selectvalue){

    System.out.println(「value」+value.getText())

  }

 e、xpath定位

  Xpath是一個很是強大的定位方式,幾乎能夠定位到全部數據,可是在咱們學習Xpath定位以前,咱們要知道明確兩個概念,絕對路徑&相對路徑,絕對路徑是以「/」開始的,

  例如/body/buttononclick/input[1], 這就是絕對路徑的表達形式,相反「相對路徑」是以「//」開頭的,好比//input[2],另外須要多說一句的是,當xpath的路徑以"/"開頭時,表示

  讓Xpath解析引擎從文檔的根節點開始解析。當xpath路徑以"//"開頭時,則表示讓xpath引擎從文檔的任意符合的元素節點開始進行解析。而當/出如今xpath路徑中時,則表示

  尋找父節點的直接子節點,當"//"出如今xpath路徑中時,表示尋找父節點下任意符合條件的子節點,無論嵌套了多少層級(這些下面都有例子,你們能夠參照來試驗)。弄清

  這個原則,咱們就能夠靈活的使用 Xpaht進行定位了,下面仍是看幾個"栗子"吧  

  查找頁面根元素://
  查找頁面上全部的input元素://input

  查找頁面上第一個form元素內的直接子input元素(即只包括form元素的下一級input元素,使用絕對路徑表示,單/號)://form[1]/input

  查找頁面上第一個form元素內的全部子input元素(只要在form元素內的input都算,無論還嵌套了多少個其餘標籤,使用相對路徑表示,雙//號)://form[1]//input

  查找頁面上第一個form元素://form[1]

  查找頁面上id爲loginForm的form元素://form[@id='loginForm']

  查找頁面上具備name屬性爲username的input元素://input[@name='username']

  查找頁面上id爲loginForm的form元素下的第一個input元素://form[@id='loginForm']/input[1]

  查找頁面具備name屬性爲contiune而且type屬性爲button的input元素://input[@name='continue'][@type='button']

  查找頁面上id爲loginForm的form元素下第4個input元素://form[@id='loginForm']/input[4]

  查找頁面上id是以「myid"開始/結尾關鍵字的元素://img[starts-with(@id,'myid')]  //img[ends-with(@id,'myid')] 

  查找頁面上id屬性包含'g1'關鍵字的元素://img[contains(@id,'g1')]

    查找頁面上文本是「百度搜索」的全部元素://a[text()='百度搜索']      //a[contains(text(),"搜索")] --文本模糊定位

  查找頁面上input的最有一個元素://input[last()]  函數位置定位

  a、經過路徑定位

  WebElement xpath = driver.findElement(By.xpath("html/body/div/form/input"));

  WebElement xpath = driver.findElement(By.xpath("//input"))

  b、經過索引定位

  WebElement xpath = driver.findElement(By.xpath("//input[3]"));

  c、經過屬性定位

  WebElement xpath = driver.findElement(By.xpath(""//*[@id='su' and @type='submit']""));

  WebElement xpath = driver.findElement(By.xpath(""//*[@id='su'][type='submit']""));

  d、文本屬性定位

  WebElement xpath = driver.findElement(By.xpath("//div[@class='qrcode-text']/p/b[text()='百度']"));

  e、模糊匹配

  WebElement xpath = driver.findElement(By.xpath("//input[starts-with(@id,'su')"));

  WebElement xpath = driver.findElement(By.xpath("//input[ends-with(@id,'su')"));

  WebElement xpath = driver.findElement(By.xpath("//input[contains(@id,'su')"));

  WebElement xpath = driver.findElement(By.xpath(""//*[@id='su'][type='submit']""));

  代碼實例:WebElement xpath = driver.findElement(By.xpath("//form[@id='loginForm']"))

  xpath定位就介紹這些,後續還會更新關於Cssselect、js定位、下拉框、單選/多選框、文本框、彈窗、句柄等,敬請關注

  小技巧:
  1.當頁面元素有id屬性時,最好儘可能用id來定位。但因爲現實項目中不少程序員其實寫的代碼並不規範,會缺乏不少標準屬性,這時就只有選擇其餘定位方法。

  2.xpath很強悍,但定位性能不是很好,因此仍是儘可能少用。若是確實少數元素很差定位,能夠選擇xpath或cssSelector。若是自動化案例中使用大量的Xpath進行定位,你會發現你的腳本執行時間很是的長,慎用。

  3.當要定位一組相同元素時,能夠考慮用tagName或name。

  4.當有連接須要定位時,能夠考慮linkText或partialLinkText方式。

     5.在進行定位的時候,儘可能使用相對路徑定位,若是使用絕對路徑,那麼一但頁面結構變化,則沒法使用原有的定位方式,可是相對路徑就特別靈活,複用性高,也是項目中特別經常使用的方式

相關文章
相關標籤/搜索