Selenium基本用法以及元素定位

来源:https://www.cnblogs.com/xiaozhao0709/archive/2018/05/30/9112516.html
-Advertisement-
Play Games

一、Selenium 簡介 Selenium是ThroughtWorks公司一個強大的開源Web功能測試工具系列,提供一套測試函數,用於支持Web自動化測試。函數非常靈活,能夠完成界面元素定位、視窗跳轉、結果比較。他支持IE、Firefox、Safari、Chrome、Android手機瀏覽器,也支 ...


一、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。

二、selenium基本功能

  1、瀏覽器並打開指定網頁

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

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

  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");

  2、瀏覽器操作  

  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() //返回當前的瀏覽器的所有視窗句柄

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

三、基本元素定位

 a、元素定位: 

 例子:

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

  1、By.id(id) //用唯一屬性id來定位非常推薦使用 優先順序最高
  2、By.name(name) //用name屬性來定位也是非常高效的優先順序僅次於id
  3、By.linkText(linkText) //即通過超文本鏈接上的"文字信息"來定位元素,這種方式一般專門用於定位頁面上的超文本鏈接:一般tag為<a>屬性href=鏈接
  4、By.partialLinkText(linkText) //適用於鏈接類的元素,模糊匹配,即包含herf屬性的元素 ,同BylinkText()
  5、By.className(className)) //對於元素的屬性包含class的情況適用 <class = "src">
  6、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.在進行定位的時候,儘量使用相對路徑定位,如果使用絕對路徑,那麼一但頁面結構變化,則無法使用原有的定位方式,但是相對路徑就特別靈活,復用性高,也是項目中特別常用的方式

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系統環境 伺服器系統:Windows Server2012 R2 MongoDB:v3.4.4 可以通過命令:mongo -version 查看版本信息 場景:備份資料庫smp_maint_2,還原到新建的資料庫smp_maint_2_restore中。 MongoDB資料庫備份 1、語法: mon ...
  • NSMutableAttributedString let testAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue, NSAttributedStringKey.backgroundColor: UIColor.ye ...
  • Swift代理的使用 協議規定了用來實現某一特定功能所必需的方法和屬性。 任意能夠滿足協議要求的類型被稱為遵循(conform)這個協議。 類,結構體或枚舉類型都可以遵循協議,並提供具體實現來完成協議定義的方法和功能。 1、申明代理 // 協議內容 @objc protocol TLSelectVi ...
  • SharedPreferences是Android平臺上一個輕量級的存儲類,用來保存應用的一些常用配置,比如Activity狀態,Activity暫停時,將此activity的狀態保存到SharedPereferences中;當Activity重載,系統回調方法onSaveInstanceState ...
  • 第1條:使用一套資源 這是最基本的一條規則,但非常重要。 對於絕大對數APP來說,只需要取一套設計圖就足夠了。鑒於現在解析度的趨勢,建議取720p的資源,放到xhdpi目錄。 相對於多套資源,只使用720P的一套資源,在視覺上差別不大,很多大公司的產品也是如此,但卻能顯著的減少資源占用大小,順便也能 ...
  • Rx,Reactive Extension,源於微軟,火於NetFlix。 線上編輯器jsbin. CDN:https://unpkg.com/rxjs/bundles/rxjs.umd.min.js Rx理解:把任何變化想象成依據事件緯度變化的事件流 一、rxjs改造輸入框 rxjs庫 把inpu ...
  • 關於Rollup rollup是一款用來es6模塊打包代碼的構建工具(支持css和js打包)。當我們使用ES6模塊編寫應用或者庫時,它可以打包成一個單獨文件提供瀏覽器和Node.js來使用。 它的優點有如下: 能組合我們的腳本文件。 移除未使用的代碼(僅僅使用ES6語法中)。 ... ...
  • 1 2 (function (window, document, undefined) { 3 var hearts = []; 4 window.requestAnimationFrame = (function () { 5 return window.requestAnimationFrame... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...