python_UI自動化--Webdriver中的常用方法
阿新 • • 發佈:2021-06-27
from
selenium
import
webdriver
driver
=
webdriver.Chrome()
driver.get(
"https://www.baidu.com/"
)
1、
WebDriver 中常用的一些方法
"""
(1) clear() 清楚文字 例:
driver.find_element_by_id("kw").send_keys("測試學習")
driver.find_element_by_id("kw").clear()
(2) send_keys(value) 模擬輸入 例:
driver.find_element_by_id("kw").send_keys("測試學習")
(3) click() 點選元素 例:
driver.find_element_by_id("kw").send_keys("測試學習")
driver.find_element_by_id("kw").click()
(4) submit() 提交表單
當沒有搜尋按鈕時 例:
driver.find_element_by_id("kw").send_keys("測試學習")
driver.submit()
"""
<br>
#獲取輸入框的尺寸
size
=
driver.find_element_by_id(
"kw"
).size
print
(size)
<br>
#獲取備案文字資訊
text
=
driver.find_element_by_id(
"cp"
).text
print
(text)
<br>
#獲取元素的屬性:id,name,class等
attribute
=
driver.find_element_by_id(
"kw"
).get_attribute(
"name"
)
print
(attribute)
<br>
#返回的元素是否可見,可見返回True,不可見返回False
result
=
driver.find_element_by_id(
"kw"
).is_displayed()
print
(result)
driver.quit()
二、elenium中hidden或者是display = none的元素是否可以定位到?答:能定位到,只是不能操作,想點選的話,可以用js去掉dispalay=none的屬性
如果面試官想問的是定位後操作隱藏元素的話,本質上說這個問題就是毫無意義的,web自動化的目的是模擬人的正常行為去操作。
如果一個元素頁面上都看不到了,你人工也是無法操作的是不是?人工都不能操作,那你自動化的意義又在哪呢?所以這個只是為了單純的考察面試者處理問題的能力,沒啥實用性!(面試造飛機,進去擰螺絲)
既然面試官這麼問了,那就想辦法回答上給個好印象吧!
首先selenium是無法操作隱藏元素的(但是能正常定位到),本身這個框架就是設計如此,如果非要去操作隱藏元素,那就用js的方法去操作,selenium提供了一個入口可以執行js指令碼。
js和selenium不同,只有頁面上有的元素(在dom裡面的),都能正常的操作,接下來用js試試吧!訪問百度 這個連結是隱藏的,但是能用js點到from selenium import webdriverdriver = webdriver.Firefox()
driver.get(“http://localhost:63342/test1122/a/b.html”)js點選hidden元素
js = ‘document.getElementById(“baidu”).click()’
driver.execute_script(js)
三、selenium中如何保證操作元素的成功率?也就是說如何保證我點選的元素一定是可以點選的?
1.首先通過封裝find方法,實現wait_for_element_ispresent(WebDriverWait)
2.在對頁面進行click之前,先滾動到該元素(通過Js封裝),避免在頁面未載入完成前或是在下拉之後才能顯示。
3.不同方式進行定位,與expected_conditions判斷方法封裝,迴圈判斷頁面元素出現後再操作;
4.開發人員規範開發習慣,如給頁面元素加上唯一的name,id等。 四、如何提高selenium指令碼的執行速度?
1.優化測試用例。設定等待時間的時候,少用sleep,儘量不用implicitly_wait,多用顯式等待方法;
2.減少不必要的操作步驟。如經過三四步才能開啟要測試的頁面的話,可以直接通過網址來開啟;
3.中斷頁面載入。如果載入的內容不影響我們測試,就設定超時時間,中斷頁面載入;
4.使用Selenium grid,通過testNG實現併發執行。 在編寫測試用例的時候,實現鬆耦合,然後再伺服器允許的情況下,儘量設定多執行緒實現併發執行。 五、用例在執行過程中經常會出現不穩定的情況,也就是說這次可以通過,下次就沒辦法通過了,如何去提升用例的穩定性?
1.在經常檢測失敗的元素前儘量加上顯式等待時間,等要操作的元素出現之後再執行下面的操作;
2.多執行緒的時候,減少測試用例耦合度,因為多執行緒的執行順序是不受控制的;
3.多用 try 捕捉,處理異常;
4.儘量使用測試專用環境,避免其他型別的測試同時進行,對資料造成干擾。 六、如何設計高質量自動化指令碼
1.使用四層結構實現業務邏輯、指令碼、資料分離。
2.使用PO設計模式,將一個頁面用到的元素和操作步驟封裝在一個頁面類中。如果一個元素定位發生了改變,我們只用修改這個頁面的元素屬性
3.對於頁面類的方法,我們儘量從客戶的正向邏輯去分析,方法中是一個獨立場景,例如:登入到退出,而且不要想著把所有的步驟都封裝在一個方法中。
4 測試用例設計中,減少測試用例之間的耦合度。 七、你的自動化用例的執行策略是什麼?
1.自動化測試用例是用來監控的。整合到jenkins,建立定時任務定時執行;
2.有些用例在產品上線前必須迴歸。jenkins上將任務繫結到開發的build任務上,觸發執行;
3.有些用例不需要經常執行。jenkins建立一個任務,需要執行的時候人工構建即可。 八、什麼是持續整合
頻繁的將程式碼整合到主幹,持續性的進行專案的構架,以便能能夠快速發現錯誤,防止分支大幅度偏離主幹 九、自動化測試的時候是不是需要連線資料庫做資料校驗?
UI自動化不需要
介面測試會需要 十、Selenium有幾種定位方式?你最偏愛哪一種,為什麼?
與name有關的有三種:name、class_name、tag_name
與link相關的有兩種:link_text、partitial_link_text
與id有關:id
全能選手:xpath、css_selector
如果存在id,我一定使用Id,因為簡單方便,定位最快。其次是Xpath,因為很多情況下html標籤的屬性不夠規範,無法唯一定位。Xpath是通過相對位置定位
如果沒有,那麼CSS定位器應該被優先考慮,因為在大多數現代瀏覽器中,它們的評估速度比XPath更快。 十一、如何去定位頁面上動態載入的元素?
首先觸發動態事件,然後再定位。如果是動態選單,則需要層級定位。——JS實現(對動態事件封裝) 十二、如何去定位屬性動態變化的元素?
先去找該元素不變的屬性,要是都變,那就找不變的父元素,用層級定位(以不變應萬變)
屬性動態變化也就是指該元素沒有固定的屬性值,可以通過:
JS實現,
通過相對位置來定位,比如xpath的軸,paren/following-sibling/percent-sibling
http://www.cnblogs.com/zhaozhan/archive/2009/09/10/1564332.html點選連結以後,selenium是否會自動等待該頁面載入完畢?
不會的。所以有的時候,當selenium並未載入完一個頁面時再請求頁面資源,則會誤報不存在此元素。所以首先我們應該考慮判斷,selenium是否載入完此頁面。其次再通過函式查詢該元素。 十三、webdriver client的原理是什麼?
在selenium啟動以後,driver充當了伺服器的角色,跟client和瀏覽器通訊,client根據webdriver協議傳送請求給driver。driver解析請求,並在瀏覽器上執行相應的操作,並把執行結果返回給client.
webdriver的協議是什麼?
WebDrive協議本身是http協議,資料傳輸使用json啟動瀏覽器的時候用到的是哪個webdriver協議?
-http 十四、什麼是page object設計模式?
1.通俗來講,把每個頁面當成一個頁面物件,頁面層寫定位元素方法和頁面操作方法
2.用例層從頁面層呼叫操作方法,寫成用例
3.可以做到定位元素與指令碼的分離page object設定模式中,是否需要在page裡定位的方法中加上斷言?
不需要,page頁只做元素抓取和操作方法page object設計模式中,如何實現頁面的跳轉?
初始化driver引數,Page類傳driver引數 十五、怎樣去選擇一個下拉框中的value=xx的option?
1.select類裡面提供的方法:select_by_value(“xxx”)
2.xpath的語法也可以定位到 十六、什麼是斷言和驗證?
斷言(assert):測試將會在檢查失敗時停止,並不執行後續的檢查
優點:可以直截了當的看到檢查是否通過
缺點:檢查失敗後,後續檢查不會執行,無法收集那些檢查結果狀態
驗證(vertify):將不會終止測試
缺點:你必須做更多的工作來檢查測試結果:檢視日誌——>耗時多,所以更偏向於斷言 十七、你覺得自動化測試最大的缺陷是什麼?
不穩定
-可靠性不強
-不易維護
-成本與收益 十八、什麼是分層測試?
1.資料層
2.介面層
3.UI層 十九、webdriver可以用來做介面測試嗎?
不可以,webdriver是專門做web的UI自動化引數 二十、get和post 的區別?
1、GET請求:請求的資料會附加在URL之後,以?分割URL和傳輸資料,多個引數用&連線。
POST請求:POST請求會把請求的資料放置在HTTP請求包的包體中。
2、傳輸資料的大小
使用GET請求時,傳輸資料會受到URL長度的限制。
對於POST,理論上是不會受限制的
3、安全性。POST的安全性比GET的高 二十一、三種等待
(1)強制等待
time.sleep(10):如果設定10秒,即使頁面已經加載出來了,也不執行操作,必須夠10秒才能執行下面的操作
(2)隱形等待
driver.implicitly_wait(30):設定最長的等待時間,在這個時間內載入完成,則執行下一步操作,整個driver的會話期內,設定一次即可,全域性可用,應用度上不靈活
(3)顯性等待
明確等到某個條件滿足後,再去執行下一步操作,程式每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設定最長時間,然後丟擲TimeoutException
WebDriverWait()類,顯性等待類,
用法:WebDriverWait(driver,等待時間,輪詢週期).until()/until_not(判斷條件)
1、先確定元素的定位表示式
2、呼叫WebDriverWait()類設定等待總時長,輪詢週期,並呼叫until()、until_not()方法
WebDriverWait(driver,等待時間,輪詢週期).until()/until_not(判斷條件)
3、使用ecpected_conditions對應的方法來生成判斷條件
EC.類名(定位方式,定位表示式)
例:等待百度登陸的彈框出現,再去操作彈出框#顯性等待需要引入三個庫
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(‘https://www.baidu.com/’)
driver.maximize_window()
driver.find_element_by_xpath(’//div[@id=“u1”]//a[@name=“tj_login”]’).click()
id=“TANGRAM__PSP_11__footerULoginBtn”
#顯性等待判斷
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,id)))
driver.find_element_by_id(‘TANGRAM__PSP_11__footerULoginBtn’).click()
driver.quit()