1. 程式人生 > 其它 >使用selenium實現UI自動化(一)

使用selenium實現UI自動化(一)

selenium,UI自動化測試的工具,包括webdriver,IDE,grid三個核心元件

安裝selenium

pip install selenium

python下的使用步驟:

  • 安裝selenium
  • 安裝python
  • 下載webdriver,並配置環境變數,以chromedriver為例子,在cmd輸入chromedriver如果顯示對應版本資訊,代表設定成功
  • 程式碼中import selenium

IDE

我們可以藉助IDE的錄製功能來加快我們的編寫程式碼步驟,然後新增上自定義的操作,比如等待,然後匯出python指令碼。這裡看個人喜好,具體使用這裡自行百度

GRID

支援在多臺不同的執行機上執行測試用例,在案例集比較龐大時,可以用來加快執行

 如下是通過ide錄製的簡單例子,已經在本地設定過webdriver的環境變數

# Generated by Selenium IDE
import pytest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By


class TestSearch:
    def setup_method(self, method):
        self.driver = webdriver.Chrome()

    def teardown_method(self, method):
        self.driver.quit()

    
def test_search(self): self.driver.get("https://www.baidu.com/") self.driver.find_element(By.ID, "kw").send_keys("時間") self.driver.find_element(By.ID, "su").click() time.sleep(3) self.driver.find_element(By.LINK_TEXT, "北京時間 - 國家授時中心標準時間").click()if __name__ == "__main__
": pytest.main()

實際執行自動化指令碼時,會出現由於執行太快而導致出現元素沒有定位到從而導致報錯的問題,為了避免這種,在上述例子中,我增加了簡單的等待time.sleep

這種做法只能在除錯中使用,切記不要在正式環境中使用,然後selenium提供了其他等待處理方式

隱式等待

self.driver.implicitly_wait(3)

將直接等待time.sleep(3)去掉,然後在setup中加入上述隱式等待,這樣子就可以實現在元素找到後立刻執行下一步,如果沒找到會在3秒後才會結束,缺點也有,就是這會作用於所有的find_element方法上,這樣子不同的元素出現的時間不一致,那麼等待的時間不好權衡。到這裡,我們有另外一種等待方式,顯示等待

WebDriver配合until()和until_not(),再結合內建的expected_conditions的方法使用

顯式等待 

將time.sleep(3)替換下,用顯式等待替換,修改後如下

# Generated by Selenium IDE
import pytest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class TestSearch:
    def setup_method(self, method):
        self.driver = webdriver.Chrome()

    def teardown_method(self, method):
        self.driver.quit()

    def test_search(self):
        self.driver.get("https://www.baidu.com/")
        self.driver.find_element(By.ID, "kw").send_keys("時間")
        WebDriverWait(self.driver, 10).until(
            expected_conditions.element_to_be_clickable((By.ID, "su")))
        self.driver.find_element(By.ID, "su").click()
        WebDriverWait(self.driver, 10).until(
            expected_conditions.element_to_be_clickable((By.LINK_TEXT, "北京時間 - 國家授時中心標準時間")))
        self.driver.find_element(By.LINK_TEXT, "北京時間 - 國家授時中心標準時間").click()
      

if __name__ == "__main__":
    pytest.main()

到此,最簡單的UI自動化就實現了