一、顯式等待和隱式等待:
1、直接等待:
強(qiáng)制等待,線程休眠一段時(shí)間
time.sleep(3)
2、隱式等待:
設(shè)置一個(gè)等待時(shí)間,輪詢查找(默認(rèn)0.5秒)元素是否出現(xiàn),如果在等待時(shí)間內(nèi)出現(xiàn)元素,則退出等待,如果沒有出現(xiàn)則拋出異常
self.driver.implicitly_wait(3)
(1)缺點(diǎn):設(shè)置的是全局的等待,作用于所有find_element()方法; (2)找到元素就會退出,不管元素是否加載到可點(diǎn)擊狀態(tài)。
3、顯式等待:
在代碼中定義條件,當(dāng)條件發(fā)生時(shí)才繼續(xù)執(zhí)行代碼。WedDriverWait 配合until() 或until_not() 方法,根據(jù)判斷條件進(jìn)行等待。
def findelement(self, loc, wait=10, num=0.5):
'''定位元素'''
element = WebDriverWait(self.driver, wait,num).until(EC.presence_of_element_located(loc))
return element
程序每隔一段時(shí)間(默認(rèn)0.5秒)進(jìn)行條件判斷,如果條件成立,則執(zhí)行下一步,否則繼續(xù)等待,直到超過設(shè)置的最長等待時(shí)間。
(1)注意:
until() 或until_not() 中需要傳一個(gè)方法名(不需要帶括號,僅方法名),這個(gè)方法必須要有一個(gè)入?yún)ⅲ蓞⒖紆ntil源碼)expected_conditions 中提供了大量可用的條件方法(可參考 expected_conditions 源碼)
二、web控件定位和常見操作
1、xpath
(1)缺點(diǎn):
(1)優(yōu)點(diǎn):
2、css_selector:
- 用的是css選擇器,速度更快,用樣式來定位
- by.Id,by.name,by.tag_name,by.class_name本質(zhì)是css_selector
3、Actions
3.1、ActionChains:
執(zhí)行PC端的鼠標(biāo)點(diǎn)擊,雙擊,右鍵和拖拽等事件:
3.2、TouchActions:
模擬PC和移動端的點(diǎn)擊,滑動,拖拽,多點(diǎn)觸控等多種手勢操作;
三、其他
1、多窗口處理:
- 獲取當(dāng)前頁面的句柄:
driver.current_window_handle - 獲取當(dāng)前所以的句柄:
driver.window_handles - 切換至所需要操作的句柄:
driver.switch_to.window()
def switch_window(self,data,type='index',isClose=False):
'''切換窗口,可根據(jù)index,url,title,handle切換'''
to_window=current_window = self.driver.current_window_handle # 當(dāng)前窗口句柄
windows = self.driver.window_handles # 所有窗口句柄
if type=='index' and isinstance(data,int): # 根據(jù)窗口順序切換
to_window=windows[data]
elif type=='handle':
to_window = data
else:
for handle in windows:
self.driver.switch_to.window(handle)
if type == 'url':
current_url = self.driver.current_url
if data in current_url:
to_window=handle
break
elif type=='title':
current_title=self.driver.title
if data in current_title:
to_window = handle
break
# 切換至所需要的句柄
self.driver.switch_to.window(to_window)
if isClose:
# 關(guān)閉掉第一個(gè)句柄,僅保留第二個(gè)句柄
self.driver.switch_to.window(current_window)
self.driver.close()
return current_window,to_window
2、frame處理:
- 切換至frame:
switch_to.frame(reference) (reference是傳入的參數(shù),用來定位frame,可以傳入id、name、index以及selenium的WebElement對象) - 從frame切回主文檔:
driver.switch_to.default_content() - 嵌套frame的操作:
driver.switch_to.parent_frame() (從子frame切回到父frame,如果當(dāng)前已是主文檔,則無效果)
3、JS的處理:
處理方法是用js把隱藏的顯示出來,方法如下:
js="document.getElementById('li').style.display='block';"
driver.execute_script(js)
1、時(shí)間控件的處理:
4、彈窗處理機(jī)制:
5、解決掃碼登錄問題:
1、復(fù)用已有瀏覽器:
不會重新開啟一個(gè)瀏覽器,復(fù)用已經(jīng)在運(yùn)行的瀏覽器 之后,我們就可以在啟動的瀏覽器上運(yùn)行我們的測試代碼了。
2、通過獲取當(dāng)前瀏覽器cookie的方式
- 以企業(yè)微信的后臺管理登錄為例,使用新的瀏覽器,打開登錄掃碼頁面,強(qiáng)制等待10秒手動完成掃碼,掃碼進(jìn)入管理后臺;
- 登錄后,在代碼中使用driver返回當(dāng)前頁面的cookies值,并保存為json文件;
- 后續(xù)的測試用例,可以使用新保存的cookie,添加在driver中即可
6、PO模式
(1)po模式六大原則
- 公共方法代表頁面提供的服務(wù)
- 不要暴露頁面細(xì)節(jié)
- 不要把斷言和操作細(xì)節(jié)混用
- 方法可以return到新打開的頁面
- 不要把整頁內(nèi)容都放到PO中
- 相同的行為會產(chǎn)生不同的結(jié)果,可以封裝不同結(jié)果
|