Airtest-Selenium升級相容Selenium 4.0,給你全新體驗!

AirtestProject發表於2024-03-14

此文章來源於專案官方公眾號:“AirtestProject”
版權宣告:允許轉載,但轉載必須保留原連結;請勿用作商業或者非法用途

一、前言

在上期更新推文中提到,我們Airtest-Selenium更新到了1.0.6版本,新增支援Selenium4.0的語法,那麼我們來看一下Airtest-Selenium更新後有什麼新的內容吧~

二、selenium 4.0有什麼新功能

selenium4.0最主要的還是定位元素方法的更新,與舊版本的selenium程式碼寫法存在一些差異,變得更簡潔明瞭。

1. 定位單個元素方法的更新

首先我們來看一下定位元素方法的更新,AirtestIDE同時相容新舊兩種寫法,將find_element_by_xpath()的方式更新為find_element(),目前使用AirtestIDE的Selenium視窗錄製指令碼輸出的仍然為舊寫法。但是我們是可以相容執行新寫法的~

更新前寫法(Selenium3):

driver.find_element_by_class_name("className")
driver.find_element_by_css_selector(".className")
driver.find_element_by_id("elementId")
driver.find_element_by_link_text("linkText")
driver.find_element_by_name("elementName")
driver.find_element_by_partial_link_text("partialText")
driver.find_element_by_tag_name("elementTagName")
driver.find_element_by_xpath("xpath")

更新後寫法(Selenium4):

#注意使用新寫法的時候要引用selenium的By庫
from selenium.webdriver.common.by import By

driver.find_element(By.CLASS_NAME,"xx")
driver.find_element(By.CSS_SELECTOR,"xx")
driver.find_element(By.ID,"xx")
driver.find_element(By.LINK_TEXT,"xx")
driver.find_element(By.NAME,"xx")
driver.find_element(By.PARTIAL_LINK_TEXT,"xx")
driver.find_element(By.TAG_NAME,"xx")
driver.find_element(By.XPATH,"xx")

2. 定位多個元素方法的更新

與上述定位元素一樣,定位多個元素方法的更新將find_elements_by_xpath()的方式換成了find_elements(),下面是一些寫法的變化:

更新前寫法(Selenium3):

driver.find_elements_by_class_name("className")
driver.find_elements_by_css_selector(".className")
driver.find_elements_by_id("elementId")
driver.find_elements_by_link_text("linkText")
driver.find_elements_by_name("elementName")
driver.find_elements_by_partial_link_text("partialText")
driver.find_elements_by_tag_name("elementTagName")
driver.find_elements_by_xpath("xpath")

更新後寫法(Selenium4):

#注意使用新寫法的時候要引用selenium的By庫
from selenium.webdriver.common.by import By

driver.find_elements(By.CLASS_NAME,"xx")
driver.find_elements(By.CSS_SELECTOR,"xx")
driver.find_elements(By.ID,"xx")
driver.find_elements(By.LINK_TEXT,"xx")
driver.find_elements(By.NAME,"xx")
driver.find_elements(By.PARTIAL_LINK_TEXT,"xx")
driver.find_elements(By.TAG_NAME,"xx")
driver.find_elements(By.XPATH,"xx")

3. Selenium 4新增了相對定位

selenium更新到4.0以上的版本後,新增了一個對元素相對定位的支援,他能根據某些原點元素作為參考去定位該元素附近的其他元素,目前可用的相對定位有:

  • above 元素的上方

  • below 元素的下方

  • toLeftOf 元素的左方

  • toRightOf 元素的右方

  • near 元素的附近

    #假如有九宮格button元素分別排布著1-9,如計算器排布方式
    text5 = driver.find_element(By.NAME, "5") #以數字5為原點元素的基準
    
    #在數字5的上面是數字8
    text8 = driver.find_element(locate_with(By.TAG_NAME, "button").above(text5))
    
    #在數字5的下面是數字2
    text2 = driver.find_element(locate_with(By.TAG_NAME, "button").below(text5))
    
    #在數字5的左面是數字4
    text4 = driver.find_element(locate_with(By.TAG_NAME, "button").to_left_of(text5))
    
    #在數字5的右面是數字6
    text6 = driver.find_element(locate_with(By.TAG_NAME, "button").to_right_of(text5))
    
    #預設尋找數字5附近含有該TAG_NAME且離數字5最近的元素
    Near = driver.find_element(locate_with(By.TAG_NAME, "button").near(text5))
    

三、在 AirtestIDE 上跑 selenium4.0 的新方法

1. 以定位單個元素方法的更新為例

可以看到,我們這邊可以混合使用兩種寫法的,都可以正常識別並進行正常的操作的,具體參考程式碼如下:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import WebChrome
from selenium.webdriver.common.by import By

driver = WebChrome()
driver.implicitly_wait(20)

#開啟百度網站
driver.get("https://www.baidu.com")
sleep(2.0)

#在搜尋框中搜尋2024兩會
searchbox = driver.find_element(By.ID,"kw")
searchbox.send_keys("2024兩會")
searchbox.submit()

driver.switch_to_new_tab()

#點選進入其中一個直播回放畫面
driver.find_element(By.XPATH,"//*[@id="2"]/div/div/div/div[3]/div/div/div[4]/a/button/span").click()
driver.switch_to_new_tab()
sleep(3.0)

#識別影片的簡述內容
el=driver.find_element(By.CLASS_NAME,"title-desc").text

print(el)

2. 以元素相對定位方法的更新為例

注意: 如果使用AirtestIDE原生環境跑測的同學們可能會發現出現了這個報錯資訊:No module named 'selenium.webdriver.support.relative_locator',這個是AirtestIDE環境下的相容性問題,目前我們已經在排期相容了,後續有新的相容資訊會通知大家!

雖然AirtestIDE的原生環境會有一定相容性的報錯,但是可以透過更換python路徑為本地的python環境就可以使用新的相對定位的方法啦~(PS:前提是本地的python環境下的selenium以及Airtest-Selenium的版本皆為目前最新版本)

具體更換AirtestIDE的環境為本地python環境的詳細方法,可以點選檢視我們的教程文件:https://airtest.doc.io.netease.com/IDEdocs/3.4run_script/0_run_script/#4

下面我們利用一個小小的例子,來看一下相對定位的實現情況吧。

可以看到可以透過一個已知的原點元素以及目標元素的所在方位可以透過相對定位去直接尋找,在日常編寫指令碼的時候可以更方便快捷。

參考程式碼如下:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import WebChrome
driver = WebChrome()
driver.implicitly_wait(20)

from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

#開啟計算機網站
driver.get("http://www.0756jia.com/")
sleep(2.0)

#以數字5為相對定位的原點
text5 = driver.find_element(By.ID,"simple5")

#在數字5上方是數字8
text8 = driver.find_element(locate_with(By.TAG_NAME, "A").above(text5))
text8.click()

#在數字5下方是數字2
text2 = driver.find_element(locate_with(By.TAG_NAME, "A").below(text5))
text2.click()

#在數字5左方是數字4
text4 = driver.find_element(locate_with(By.TAG_NAME, "A").to_left_of(text5))
text4.click()

#在數字5右方是數字6
text6 = driver.find_element(locate_with(By.TAG_NAME, "A").to_right_of(text5))
text6.click()

#在數字5旁邊是數字8
Near = driver.find_element(locate_with(By.TAG_NAME, "A").near(text5))
Near.click()

3.小結與注意事項

3.1 AirtestIDE更新了Airtest-Selenium,支援了Selenium 4.0的新定位語法

AirtestIDE更新了Airtest-Selenium到1.0.6版本,支援了Selenium4.0的新定位語法,包括了單個以及多個元素的定位語法,將find_element_by_xpath()的方式換成了find_element()

3.2 在本地python環境中,更新airtest-selenium、selenium,可以支援4.0新功能

雖然在AirtestIDE的原生環境中,暫時不支援進行該相對定位方式,但是可以在本地的python環境中,將Airtest-Selenium、Selenium4到更新到最新版本後,可使用新增的元素的相對定位方法。

在更新Airtest-Selenium的時候,別忘了將自己環境下的selenium更到4.0以上的版本

#更新airtest-selenium
pip install -U airtest-selenium

#更新selenium
pip install -U selenium

3.3 chrome與chromedriver對應問題

大家想用新版本的chrome瀏覽器進行自動化測試很久了,我們相容了目前新版本的chrome瀏覽器,但是要注意的是要將AirtestIDE環境下以及本地環境下的chromedriver更換成與自己chrome版本對應的才可以噢!

舊版chromedriver下載地址:https://chromedriver.storage.googleapis.com/index.html

新版chromedriver下載地址:https://googlechromelabs.github.io/chrome-for-testing/

3.4小結

目前Airtest-Selenium的1.0.6版本相容了selenium4.0的語法,我們可以更簡單快捷的完成我們想要的自動化測試效果,可以更好的聯動瀏覽器去完成更多的內容。同時我們也歡迎大家給我們投稿你們想要實現的selenium實操例子,也非常歡迎熱心同學給我們投稿自己實現的指令碼例子~

如同學們在使用新版的Airtest-Selenium時遇到了一些問題無法解決,可以透過此網站向我們的開發者快速提單:https://airtest.netease.com/issue_create 。

可以在標題中加入“Airtest-Selenium1.0.6”之類的字眼。方便我們快速篩選和排查。


AirtestIDE下載:airtest.netease.com/
Airtest 教程官網:airtest.doc.io.netease.com/
搭建企業私有云服務:airlab.163.com/b2b

官方答疑 Q 群:526033840

相關文章