多Frame框處理
在一個(gè)頁(yè)面中可以嵌套另外一個(gè)頁(yè)面,如frame/iframe技術(shù),這是現(xiàn)在很多web應(yīng)用中使用的一種方式,webdriver對(duì)象只能在一個(gè)頁(yè)面(外層是默認(rèn)的)中定位元素,需要一種方式將driver對(duì)象從外層切換給內(nèi)層使用才能對(duì)內(nèi)層的對(duì)象進(jìn)行處理。
webdriver中提供API:driver.switch_to.frame()實(shí)現(xiàn)
1)切入Frame
第一種方式,默認(rèn)是可以給ID或者name的
?? driver.switch_to.frame("login_frame")
第二種方式,可以傳參iframe的元素對(duì)象
?? iframeObj = driver.find_element_by_xpath('//*[@id="login_frame"]')
?? driver.switch_to.frame(iframeObj)
# 切換到目標(biāo)元素所在的frame
dr.switch_to.frame("iframeResult")
2)從Frame切入到主體
dr.switch_to.default_content()
警告框處理
警告框-alter,是一個(gè)模式框,該怎么使用代碼的方式去操作他?
1、driver對(duì)象不在alter上,并且我們沒辦法去定位這個(gè)窗口的元素
2、driver.switch_to.alert:暫時(shí)將瀏覽器對(duì)象driver交給alert用
3、可以對(duì)alter警告框作什么事情:
? ? ?? text:返回(獲?。?alert/confirm/prompt 中的文字信息。
? ? ?? accept():接受現(xiàn)有警告框,就是點(diǎn)他的確定按鈕
? ? ?? dismiss():放棄現(xiàn)有警告框,取消
? ? ?? send_keys(keysToSend):發(fā)送文本至警告框。
元素等待
如今很多web都在使用AJAX技術(shù),運(yùn)用這種技術(shù)的軟件當(dāng)瀏覽器加載頁(yè)面時(shí),頁(yè)面上的元素可能不會(huì)被同步加載完成,如此一來(lái),定位元素時(shí)就會(huì)出現(xiàn)困難。我們可以通過設(shè)置元素等待來(lái)改善這類問題導(dǎo)致的測(cè)試腳本不穩(wěn)定
WebDriver提供了三種種元素等待方式:
1、強(qiáng)制等待:
time.sleep(5),單位是s,休眠,就是直接讓線程休眠,這幾秒啥事也不用干
2、隱式等待:
? 在腳本創(chuàng)建driver對(duì)象之后,給driver設(shè)置一個(gè)全局的等待時(shí)間,對(duì)driver的整個(gè)生命周期(創(chuàng)建到關(guān)閉)都起效。如果在設(shè)置等待時(shí)間(超時(shí)時(shí)間)內(nèi),定位到了頁(yè)面元素,則不再等待,繼續(xù)執(zhí)行下面的代碼如果超出了等待時(shí)間,則拋出異常
? ? driver.implicity_wait(10)
? ? 注意:在使用隱式等待的時(shí)候,實(shí)際上瀏覽器會(huì)在你自己設(shè)定的時(shí)間內(nèi)部不斷的刷新頁(yè)面去尋找我們需要
? ? ? ? ? ? 要求在后續(xù)寫代碼的時(shí)候,全部都要加上這句話
3、顯式等待:
? 顯示等待,就是明確的要等到某個(gè)元素的出現(xiàn)或者是某個(gè)元素的可點(diǎn)擊等條件,等不到,就一直等,除非在規(guī)定的時(shí)間之內(nèi)都沒找到,那么就拋出Exception。(簡(jiǎn)而言之,就是直到元素出現(xiàn)才去操作,如果超時(shí)則報(bào)異常)
需要特別關(guān)注某一個(gè)元素的加載問題,才需要使用涉及到的方法:
#構(gòu)造一個(gè)WebDriverWait的一個(gè)對(duì)象
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
參數(shù)說(shuō)明:
driver:瀏覽器驅(qū)動(dòng)
timeout:最長(zhǎng)超時(shí)時(shí)間,默認(rèn)以秒為單位
poll_frequency:檢測(cè)的間隔步長(zhǎng),默認(rèn)為0.5s
ignored_exceptions:超時(shí)后的拋出的異常信息,默認(rèn)拋出NoSuchElementExeception異常。
util(method,info):直到滿足某一個(gè)條件,返回結(jié)果,等不到就報(bào)錯(cuò)
method->expected_conditions.presence_of_element_located(locator):判斷某個(gè)元素是否定位到了
? ? locator-->(By.Id,"kw")\(By.Name,"wd")
需求:使用顯示等待的方式去等百度首頁(yè)的百度一下按鈕顯示出來(lái),如果出來(lái)就點(diǎn)擊,否則print()
? 注意:若同時(shí)設(shè)置了隱式等待和顯示等待,則以隱式等待為第一優(yōu)先級(jí),也就是說(shuō),若隱式等待時(shí)間大于顯示等待,顯示等待時(shí)間設(shè)置無(wú)效,因?yàn)閐river若找不到元素,會(huì)先等待隱式等待的時(shí)間,對(duì)time.sleep()沒有影響,只要執(zhí)行到這句代碼,就會(huì)等待
頁(yè)面滾動(dòng)條操作
使用JS實(shí)現(xiàn)
? 到底部:js="document.documentElement.scrollTop=10000"
? 到頂部: js="document.documentElement.scrollTop=0"
? 左右移動(dòng):js="window.scrollTo(200,1000)"
? Js代碼的執(zhí)行需要用到的方法:driver.execute_script(js)