使用 Robot Framework 建立Robotic Process Automation

Flyhead
9 min readMar 26, 2021

--

Photo by Eleventh Wave on Unsplash

你得線上打卡嗎?

使用 Robot Framework 解決自動化的需求,比如自動上下班打卡?

那為什麼選擇 Robot Framework?

透過 Keyword 撰寫維護 Tese Case 較為容易

支援 Selenium,而上下班打卡系統也支援瀏覽器版本

若有需要,可透過 Python 加以擴充Keyword

開發環境建置

建立目錄

$ mkdir <DIR-NAME>

建立虛擬環境

$ conda create — name <ENV-NAME> python=<PYTHON-VER>

參數安裝相關函式庫

$ conda install -c conda-forge nodejs jupyterlab robotframework-seleniumlibrary geckodriver python-chromedriver-binary pillow lunr$ pip install robotkernel robotframework-seleniumscreenshots robotframework-selenium2library nbimporter

安裝 Jupyter lab robot 編輯器

$ jupyter labextension install jupyterlab_robotmode

安裝 robotmode extension

點選 Extension Manager > Enable 按鈕

搜尋並安裝 robotmode extension

安裝 chromedriver

檢查電腦上安裝的 Chrome 版本 (說明>關於 Google Chrome),前往 https://sites.google.com/a/chromium.org/chromedriver/downloads 下載對應的 chromedriver,再丟到所使用的virtual environment 下 (C:\Users\<USER_NAME>\Anaconda3\envs\RPA)。

如果看到下列錯誤訊息,就是代表你下載的chromedriver 版本和 PC 上不匹配

Selenium message:session not created: This version of ChromeDriver only supports Chrome version XX

測試開發環境

  • Launcher 上選擇 Robot Framework notebook
  • 執行下列 Test Cast
*** Settings ***
Library SeleniumLibrary
*** Test Cases ***
Go to google.com
Open Browser https://www.google.com chrome

千萬切記, Open Browser keyword 和後面參數必須間隔兩個以上的空白 (keyword 才是間隔一個空白),否則會誤認參數為keyword 的一部分。

如果一切順利,一個獨立的 Chrome 將會被開啟。

Selenium2Library 介紹

Selenium2Library 是最常用來做網站測試的 Robot Framework 的函式庫

常用 Keyword

Click Button   locatorClick Element  locatorInput Text     locator, textOpen Browser   url, browser=firefox, alias=None, remote_url=False, desired_capabilities=None, ff_profile_dir=NoneClose Browser

定位

Keyword 中使用 locator 已定位要操作的網頁元件, Selenium2 Library 支援多種 locator 策略

  • Default locator strategy
  • Explicit locator strategy
  • Implicit XPath strategy

Default locator strategy

Click Element example  # Match based on id or name=example.Click Link    example  # Match based on link text and href=example.Click Button  example  # Match based on id, name or value=example.

Explicit locator strategy

Click Element  id:examplenamename  #Element id=exampleClick Element  name:example        #name attribute=exampleClick Element  identifier:example  #Either id or nameClick Element  class:example       #Element class=exampleClick Element  tag:div             #Tag name=div Click Element  xpath://div[@id="example"]  #XPath expression,<div> with id attribute=exampleClick Element  css:div#example  #CSS selector, <div> with id attribute=exampleClick Element  dom:document.images[5]  #DOM expression,5th image elementClick Element  link:The example   #Exact text a link has The example

Implicit XPath strategy

參數以 // 或 (// 起始的,當為 XPath 表示式,不需要加上 xpath prefix

Click Element  //div[@id=”foo”]//h1Click Element  (//div)[2]

何謂 XPath?

基本語法

/bookshelf    # root 下第一層的 <bookshelf>//book        # 所有 <book>.book         # 從目前的節點選取..book        # 選取目前節點的parent//@price      # 所有有 price attribute 的 element

條件式

/bookshelf/book[1]            # 選取<bookstore>的children中第一個<book>/bookshelf/book[last()]       # 選取<bookshelf>的children中最後一個<book>/bookshelf/book[last()-1]     # 選取<bookshelf>的children中最後第二個<book>/bookshelf/book[position()<3] # 選取<bookshelf>的children中前兩個/bookshelf/book[@price>100.00]# 選取<bookshelf>的children中的<book>,其下的 price attribute 大於100//a[contains(text(),'Robot')]  # 選取文字包含 Robot的<a>//div[@id=”foo”]//h1           # 所有 id=foo 的 <div> 下的 <h1>//*[contains(text(), "example")] # 所有包含文字為example 的 element.

萬用字元

/bookshelf/*       # 選擇<bookshelf>下的所有children element節點//*                # 選擇文件中的全部節點//book[@id=123]    # 選擇文件中全部的含有id屬性等於123的<book>

串接多個條件

/bookshelf/book/title | //price   # 選擇文件中<bookshelf>中的<book>中的<title>及全部的<price>

額,有沒有更簡單取得 XPath的方式?

在網頁上選取要取得 XPath 的元件,按下右鍵,選單上選取 「檢查」,Chrome 會打開 Chrome Dev Tool /Elements 頁籤,並指向對應 Source 上對應 Element,然後選擇「Copy > Copy XPath」即可

要如何得知動態元件的 XPath?

很多時候,網頁元件是動態產生的,需要特定動作才能觸發,動作結束元件也就跟著消失,這時候就必須使用 「Break On」功能了

先選取動態元件的 parent 元件,按下右鍵,選單上選取 「檢查」,然後選取 「Break on> subtree modification」,或者全選。

接下來只要任何 child 元件變動,均會進入斷點逐步執行,切回 Elements 頁籤觀察,等到動態元件產生,一樣然後選擇「Copy > Copy XPath」取得 XPath。

參考文件

  1. https://robots-from-jupyter.github.io/public/static/RobotLab-Workshop_2019-01-16-596135ce8f63423ca3dbcc6fac336e2c.pdf
  2. https://matthung0807.blogspot.com/2017/12/xpath.html
  3. https://robotframework.org/Selenium2Library/Selenium2Library.html

--

--