UiPath Level 1-Lesson 6. Selectors


介:Selectors 是識別UI元素的方式。它是一個XML字符串,其中包含一些屬性可以唯一地定義指定的元素。

學習大綱:

  • 什么是Selector
  • 什么是穩定的Selector
  • 如何在Selector里插入通配符
  • 如何在Selector里插入變量

 

1. UI Exploer中的Selector

UI就是很多個互相嵌套的容器,使用UI Explorer工具可以幫助我們了解UiPath怎么去識別某個UI中的元素,了解Selector的工作原理。

1) 點擊工具欄上的Select Target Elements,再點擊UI界面中的某個元素。

2) 該UI元素的Selector顯示在下面的模塊(Selector Editor Panel)里,而左邊的模塊(Visual Tree Panel)里是一個完整的UI樹狀圖,包含了UI所有的元素。

3) 點擊Highlight工具,然后在UI Tree里選中某個元素,此時UI中對應的元素會被黃色的矩形框起來,方便查看。

4) 如果某個元素未被識別(在選取這個元素時沒有出現藍色的矩形框),可以更改UiFrameworks的選項,再重新指定元素。

  • UiFrameworks用於更改確定UI元素及其Selector的技術
    • Default:UiPath的專有方法。通常適用於所有類型的用戶界面。
    • Active Accessibility:Microsoft早期提供的一種使應用程序可訪問的解決方案。當Default方法不起作用,而軟件是比較舊的版本時,推薦嘗試這種方法。
    • UI Automation:Microsoft改良過的訪問模式。當Default方法不起作用,而軟件是比較新的版本時,推薦嘗試這種方法。

  

5) 上面的模塊(Property Explorer Panel)顯示的是未優化的原始Selector,它包含了目標元素的完整路徑。下面的模塊則是優化過的最終Selector。

  • UiPath默認使用第一層和最后一層容器來構成最終的Selector,因此優化過的Selector里的元素會少一些。
  • 選擇或者取消選擇某一行,可以在最終的Selector里添加或刪除元素。

6) 優化后的Selector是標准的XML代碼,它由兩部分構成:

  • 元素類型:wnd和uia。元素的類型一目了然,比如window,control,HTML,Java等等。
  • 屬性 (Attributes):元素類型后面的部分,它是Selector識別特定元素的關鍵。
    • 下列代碼的第一行表示名為applicationframehost.exe的應用程序,該程序的Class是ApplicationFrameWindow,標題是All Calendars - Calendar。如果任一條件不匹配,就找不到這個應用程序。

   

7) 屬性顯示在右邊的模塊(Selector Attributes Panel)。選擇或者取消選擇某個屬性,會相應的更改Selector。

總結:Selector就是UI元素和相關屬性的列表,UiPath根據這些信息去匹配屏幕上已有的元素。

注意:在一些情況下,當UiPath和目標應用程序時用不同的權限打開的,Selector可能無法正常作用。推薦總是用相同的權限打開程序。


 

2. Selector的調試

實例:用Basic方式錄制一個Sequence,在名為SelectorsTest.txt的文本文件里錄入一段文字。

分析:

1) 查看Type Into活動的屬性面板,打開Selector Editor。

2) 關掉SelectorsTest.txt,打開五個新記事本並運行Sequence,30秒后UiPath將報錯。

* 這種提示大部分都是Selector出現問題。

3) 問題出在title屬性上。由於指定了標題,當SelectorsTest.txt沒有打開時,程序就無法正常運行。

4) 考慮到你是想讓這個程序在任何文本文件里都可以運行,還是只在指定的文件里運行,這可以是一個bug,也可以不是。

5) 如果想要程序在任何文本文件里運行,只要刪除title屬性就可以了。

6) 重新運行程序。雖然打開了五個記事本,但程序只會在最上層的記事本里運行。

 

*Selector Editor和UI Explorer有所不同。在Selector Editor的Edit Attributes模塊里,該Selector包含的所有UI元素的相關屬性都會列出來。而在UI Explorer里,只會顯示選中的那個UI元素的相關屬性。

點擊左下角的Open in Explorer可以在UI Explorer里查看和修改更多的UI元素和屬性。你也可以在Selector Editor的Edit Selector模塊里手動修改代碼。


 

3. 自定義Selector

1) Full Selector和Partial Selector

Full Selector:包含了確定該UI元素位置的所有必要信息,其中包括頂級窗口的信息。

 

Partial Selector:不包括頂級窗口的信息,但是嵌套在一個包含了頂級窗口信息的容器中,比如Attach Window活動,Open Application活動。

除了是否包含頂級窗口的信息,Full Selector和Partial Selector沒有什么區別。在同一個窗口執行多個操作時建議使用Partial Selector;需要在多個窗口之間切換時建議使用Full Selector。如果可能受到其他應用程序或窗口的干擾,最好使用Partial Selector。

*Full Selector也可以在Attach Window或者Open Application等的容器中使用。

*錄制功能的Basic模式使用的都是Full Selector,Desktop模式使用的都是Partial Selector。

 

2) 動態Selector:通配符

  • * (星號):代替任意個字符。
  • ? (問號):代替任意一個字符。

實例1:如何讓UiPath識別出一個名為“Daily Report - ”加上當天的日期的文本文件。

方法:將動態的部分,在這里即日期,用*表示。

 

實例2:首先在亞馬遜首頁查詢書A的價格,接着用Basic模式錄制下列操作:選中並清空搜索欄,輸入書B的名稱並查詢,讀取書B的價格並用Message Box顯示。

運行程序30秒鍾后,將收到下面的錯誤信息。

分析:由於首先查詢了書A,在錄制過程中瀏覽器的標題包含書A的名稱。但是在錄制結束后,瀏覽器的標題已經變成了書B,因此UiPath無法識別出瀏覽器窗口來運行程序。

方法:可以直接去掉title屬性。但是更好的方法是,把書A的名稱替換為通配符*。GetText活動的Selector也需要相應的修改。

 

3) 動態Selector:Attach to Live Element

如果不使用通配符的方法修改Selector,還可以使用Attach to Live Element。

找到出錯的Selector,點擊Selector Editor右上角的Attach to Live Element,然后再次點擊UiPath運行時沒能識別出的元素,比如實例2中的搜索欄。UiPath會將之前的Selector和這一次的進行對比,用*代替其中不同的部分。

 

4) 動態Selector:Index

Index告訴UiPath應該選擇第幾個UI元素。

實例:在記事本中錄制一個更改字體的Sequence,並把它改成選擇第四種字體。

方法:錄制完成后,從Selector Editor中打開UI Explorer。如果我們去掉字體名稱的屬性,它將會被自動替換為idx=4。

*如果在一個Selector中出現了Index屬性,這是一個信號,說明現有的屬性不足以讓UiPath識別出目標UI元素,因此需要依靠Index屬性來找到它。但是這樣的Selector是不可靠的,我們應該嘗試添加其他上級元素或者屬性而避免使用Index。

*應盡量避免使用大於2的Index屬性,嘗試添加其他的屬性來確保Selector的穩定性。

 

5) 動態Selector:變量

實例:用戶輸入一個0-9的數字,在Windows自帶的計算器中標亮這個數字。

方法:

  • 添加一個Input Dialog方法,要求用戶輸入0-9的數字,輸出變量digit
  • 添加一個Highlight方法,然后隨便指定一個計算器中的數字,這里指定0。
  • 用UI Explorer查看計算器的UI元素,找出哪一個屬性與數字有關。

  

  

  • 包含有數字的屬性只有Automationid,需要保留。Name屬性與數字的英文有關,它是動態的,必須去掉。穩妥起見,可以把cls='Button'屬性和整個NumberPad元素去掉。最終的Selector如下圖所示。

  

  • 將最終得到的Selector復制到Highlight活動的Selector里,然后在屬性面板里把Selector里修改為<uia automationid='num" + dight + "Button'/>。
    • 一定要在屬性面板里修改,因為Selector Editor里的Selector是不帶引號的。
    • 另一個思路是聲明一個String型的變量,然后用Replace方法把Selector里的0替換為該變量。

 

4. 創建更可信的Selector

實例:

http://rpachallenge.com 網站提供了一個關於RPA的練習。在這個網站上,每點一次Submit,信息的排列順序和位置都會改變。如何讓UiPath總能定位到First Name的文本框並填入Mack的名字?

分析:

1) 首先使用UI Explorer分析First Name文本框的Selector,該Selector有一個id屬性是唯一的。

2) 點擊網頁上的Submit按鈕進入下一頁,新的First Name文本框的id屬性值和上一個不同。這說明id屬性是動態的,無法每次都定位到First Name文本框。

3) 文本框元素里沒有任何一個屬性與First Name有關。但是它的上級元素有一個aaname屬性提到了First Name,我們把這個元素添加到Selector里。

4) 該元素里的css-selector屬性是唯一的,但是只要網頁設計稍作調整,這個屬性就會發生變動,因此要把它去掉。

5) 去掉css-selector屬性后,UiPath會自動為該元素添加idx='2'屬性,這說明現有的屬性可能不足以確定該元素的位置。其原因是:除了css-selector屬性外,該元素和它的上級元素的其他屬性(aaname/ parentidid/ id)是相同的。只要把該元素的上級元素也選上,idx='2'就會消失。記得去掉新添加的元素的css-selector屬性。

6) 這個Selector是能用的,但是它存在很大的缺陷:一是該Selector僅能在特定的網頁結構下運行;二是為Selector添加過多的上級元素會讓它變得不穩定,因為上級元素只要稍有變化就會發生錯誤。

*點擊對號按鈕可以檢查當前Selector的有效性。

 

方法:此處提供兩種更穩妥的方法解決上述問題。

1) 使用Anchor Base方法

  • 在該方法的容器中,左邊放錨點(anchor)活動,右邊放要運行的其他活動。

   

  • Find Element活動或Find Image活動可以作為錨點。Find Element活動同樣通過Target里的各種屬性來定位UI元素,但不同的是它會輸出一個UIElement對象。稍后,我們將用這個對象創建一個更可信的Selector。

  

  • 先指定網頁上的First Name標簽(Label)作為錨點,標簽的Selector通常非常穩定。

  

  • 在Anchor Base容器的右邊,添加Type Into活動用來在文本框里輸入Mack的名字。指定First Name標簽右邊的文本框作為TypeInto活動的目標元素,可以看到它的Selector里只有一個tag屬性,並沒有id等動態屬性。
  • Anchor Base活動的原理是UiPath將以指定的錨點作為參考,選取屏幕上離它最近的符合Selector條件(webctrl tag='INPUT')的UI元素,這樣做縮小了搜索范圍。

  

  • Anchor Base活動有一個非常有用的屬性Anchor Position。它的默認值是Auto,但是如果錨點相對於目標元素的位置總是固定的,就可以把它改為其他值。在本例中它不是固定的,因為有時候文本框在標簽的左邊,有時候在下邊。

  

  • 由於Anchor Base活動通過錨點和目標元素在屏幕上的相對位置來進行定位,因此它無法在后台運行

 

2) 使用Select Relative Selector

  • 打開UI Explorer,先指定First Name文本框。點擊左上角工具欄里的Select Relative Element。 

  

  • 此時進入選取模式,選取First Name的標簽文字。這樣做會在列表中添加新的關於First Name標簽的元素:webctrl和nav。nav的up屬性可以導航到父元素,再從它的子元素列表里選擇目標元素(...that locates the First Name label, navigates up to the parent element level and then selects the input in the list of children elements.)。同時別忘了去掉文本框的id屬性。
    • nav支持的其他屬性有nextprev,分別表示前往結構樹的下一個或者上一個元素(...which go to the next or the previous elements in the tree respectively.)。

  

  • 添加一個Type Into活動,把得到的Selector 復制到該活動的Selector屬性里,大功告成。
  • 使用Select Relative Selector功能,程序是可以在后台運行的,因為該功能基於應用程序的內部結構而非屏幕上的位置。

 

5. 練習

要求:

1) 通過FakeNameGenerator.com生成隨機的數據,提取姓名,電話和公司名。

2) 將提取的信息填入RPAChallenge.com的對應區域。

3) 嘗試分別使用Anchor Base活動和Select Relative Element選項來獲取可靠的Selector。

思路:比較簡單,略。

注意:

  • 瀏覽器的標題可能產生變化,用通配符來避免該變化的影響。
  • FakeNameGenerator.com生成的姓名找不到合適的anchor或relative element,可以從UI Explorer里為它添加其他屬性保證Selector的可靠性。

  


 

*本課使用過的新活動、方法、函數等:

Highlight

Anchor Base

Find Element

Find Image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM