在自動化測試中,我們都知道是通過定位元素來實現(xiàn)的,那么有時候我們定位元素定位不到是為什么呢?
1、頁面出現(xiàn)了iframe
2、出現(xiàn)了新的窗口,沒有實現(xiàn)句柄的切換
3、三種等待方式,沒有選擇其中之一來使用,元素沒有被加載出來
一、iframe
iframe既是一個內(nèi)聯(lián)框架被用來在當前 HTML 文檔中嵌入另一個文檔。
通俗點就是網(wǎng)頁中的嵌套網(wǎng)頁,如果我們在做自動化測試中,需要定位的元素包含在了iframe內(nèi)聯(lián)框架里,那么我們就需要跳進iframe,如果說還需要做后續(xù)的操作,但后續(xù)的元素不在iframe中,這時候就需要再跳出iframe
我們現(xiàn)在都知道了什么是iframe,那么接下來我們拿126郵箱登錄做下示例
我們現(xiàn)來看看網(wǎng)頁中的iframe張什么樣

可以清楚的看到,當我把鼠標放到這里時,iframe元素的將整個登錄覆蓋到了,那么這時候,就需要用到iframe的跳入
iframe的跳入,我這里簡單歸納了三種,其中兩種以126登錄為例,一種為一號店登錄方式為QQ中的賬號密碼登錄。
方式一:
```
from selenium import webdriver
#實例化驅(qū)動
driver =webdriver.Chrome()
#隱式等待:
driver.implicitly_wait(20)
# 打開網(wǎng)頁:
driver.get('https://www.126.com/')
#跳進iframe,根據(jù)獲取標簽名來通過下標跳進
iframes=driver.find_elements_by_tag_name('iframe')
driver.switch_to.frame(iframes[0])
inputs = driver.find_elements_by_tag_name('input')
for i in inputs:
? ? if i.get_attribute('placeholder') =='郵箱帳號或手機號碼':
? ? ? ? i.send_keys('123456')
? ? elif i.get_attribute('placeholder') =='輸入密碼':
? ? ? ? i.send_keys('456789')
? ? ? ? break
driver.find_element_by_id('dologin').click()
```
方式二:
```
from selenium import webdriver
#實例化驅(qū)動
driver =webdriver.Chrome()
#隱式等待:
driver.implicitly_wait(20)
# 打開網(wǎng)頁:
driver.get('https://www.126.com/')
#跳進iframe,方式二,逐層定位,跳進iframe,先定為父級唯一元素,再定位包含子元素來跳進
divs = driver.find_element_by_id('loginDiv')
driver.switch_to.frame(divs.find_element_by_tag_name('iframe'))
inputs = driver.find_elements_by_tag_name('input')
for i in inputs:
? ? if i.get_attribute('placeholder') =='郵箱帳號或手機號碼':
? ? ? ? i.send_keys('123456')
? ? elif i.get_attribute('placeholder') =='輸入密碼':
? ? ? ? i.send_keys('456789')
? ? ? ? break
driver.find_element_by_id('dologin').click()
```
方式三,因為126登錄中,我嘗試了用get_attribute方式來跳進,但是通過獲取frameborder="0"這個元素名與值在iframe中跳進是不支持的,而且它的其他元素,比如id是自增類型,那么我們在實際操作中,如果存在很多iframe,但有些元素是唯一的,那么還是可以更便捷一點,這里舉例一號店登錄方式中的QQ登錄,以賬戶密碼登錄方式
```
from selenium import webdriver
#實例化驅(qū)動
driver = webdriver.Chrome()
#隱式等待
driver.implicitly_wait(20)
#打開126登錄頁面:
driver.get('https://passport.yhd.com/passport/login_input.do')
#點擊QQ登錄
driver.find_element_by_class_name('iconfont').click()
#句柄切換:
driver.switch_to.window(driver.window_handles[-1])
#跳進iframe方式三:先獲取所有的iframe的標簽名
iframes = driver.find_elements_by_tag_name('iframe')
for i in iframes:
? ? #循環(huán)查找符合條件的那一組iframe
? ? if i.get_attribute('width') =='370':
? ? ? ? #跳進我想要跳進的iframe
? ? ? ? driver.switch_to.frame(i)
#點擊賬號密碼登錄
driver.find_element_by_id('switcher_plogin').click()
```
跳出iframe
```
#跳出iframe: 回到默認的上下文driver.switch_to.default_content()
```
總結:
其實,只要定位到了iframe元素,無論那種方式,都可以跳進或者你有更好的辦法都可以,我相信大家都會有比我更敏捷的方法
二、什么是句柄?
通俗點講,句柄就是瀏覽器中的窗口。我們都知道,一個瀏覽器可以打開很多個頁面,那么在沒有關閉的情況下,他會一個個展示在瀏覽器的上方,我們可以通過點擊它來切換回歷史打開的窗口。那么在自動化測試中,是叫做句柄,也就是說,在打開很多個窗口的時候,我們的測試工具它是不知道具體你要操作的是哪一個窗口? 所以這里,就涉及到了句柄切換
這里也是拿一號店來舉例,我們在進入一號店登錄頁面后,點擊QQ的方式來登錄,就會彈出新的窗口,這時候就需要切換到我們具體想要操作的窗口

那么,我想要切進QQ賬號安全登錄應該怎么做呢?
代碼演示:
```
from selenium import webdriver
#實例化驅(qū)動
driver = webdriver.Chrome()
#隱式等待
driver.implicitly_wait(20)
#打開126登錄頁面:
driver.get('https://passport.yhd.com/passport/login_input.do')
#點擊QQ登錄
driver.find_element_by_class_name('iconfont').click()
#句柄切換: 這里先是收集所有的窗口,以列表的形式展示
wins = driver.window_handles
#這里打印下它(具體操作不需要打印,這里是為了更直觀的讓您了解它)
print(wins)
#之后具體切換我們想要的哪一個,比如你想要將操作實時保持在最前,那-1就可以咯
driver.switch_to.window(wins[-1])
```
句柄打印結果

如果還想要切換回去,那么你就根據(jù)下標來切換就好啦

三、Select下拉框
在自動化測試中,我們有三種方法可以進行下拉選擇
這里舉例攜程網(wǎng)中國內(nèi)酒店的三個下拉框

在下拉框中有三種定位方式
方式一
代碼展示:
```
from selenium import webdriver
#實例化驅(qū)動
driver = webdriver.Chrome()
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('https://www.ctrip.com/')
from selenium.webdriver.support.ui import Select? #導入Select下拉框
#方式一: 根據(jù)index下標來選擇房間數(shù):
#先定位到房間數(shù)
fj = driver.find_element_by_id('J_roomCountList')
#實例化select
select1 = Select(fj)
#根據(jù)下標來選擇房間數(shù)為2的? 因為第一個下標為0,房間數(shù)為1,所以第二個下標為1,房間數(shù)為2
select1.select_by_index(1)
```
方式二,根據(jù)value元素值來切換
元素信息展示:
代碼實現(xiàn)
```
from selenium import webdriver
#實例化驅(qū)動
driver = webdriver.Chrome()
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('https://www.ctrip.com/')
from selenium.webdriver.support.ui import Select? #導入Select下拉框
#方式二: 根據(jù)value值來選擇房間數(shù):
#先定位到房間數(shù)
fj = driver.find_element_by_id('J_roomCountList')
#實例化select
select1 = Select(fj)
#根據(jù)元素value的值來進行房間數(shù)的切換,這里切換為value值2的,也是
#房間數(shù)為2
select1.select_by_value('2')
```
方式三
使用visible_text()文本信息輸入的方式來進行下拉框選擇
代碼實現(xiàn)
```
from selenium import webdriver
#實例化驅(qū)動
driver = webdriver.Chrome()
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('https://www.ctrip.com/')
from selenium.webdriver.support.ui import Select? #導入Select下拉框
#方式三: 根據(jù)文本內(nèi)容來選擇房間數(shù):
#先定位到房間數(shù)
fj = driver.find_element_by_id('J_roomCountList')
#實例化select
select1 = Select(fj)
#復制頁面中的文本信息就可以,使用visible_text方式
select1.select_by_visible_text('3間')
```
四、alert彈窗處理
對頁面進行操作后,出現(xiàn)的彈窗提示進行處理
這里我拿首頁百度中的----設置—搜索設置–保存設置—對彈窗處理,這一個流程做示例
首先要懸浮到這個元素
點擊搜索設置,之后點擊保存設置,對彈窗進行處理
在alter中,有兩種處理方式,一個為確定,一個為取消
對彈出框進行確定操作,代碼演示
```
from selenium import webdriver
#實例化驅(qū)動
driver = webdriver.Chrome()
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('http://www.baidu.com')
from selenium.webdriver.common.action_chains import ActionChains #導入鼠標懸浮模塊
#將鼠標懸浮在設置上
set = driver.find_element_by_id('s-usersetting-top')
ActionChains(driver).move_to_element(set).perform()
#點擊搜索設置
driver.find_element_by_class_name('setpref').click()
#點擊保存設置
driver.find_element_by_class_name('prefpanelgo').click()
#對彈窗進行確定操作
alert = driver.switch_to.alert
alert.accept()
```
對彈出框做取消操作
代碼演示
```
#對彈窗進行取消操作alert = driver.switch_to.alert
alert.dismiss()
```
以上就是selenium的幾種常見操作整理