什么?你正在學web自動化測試?那這些Selenium的基本操作你了解過嗎?

在自動化測試中,我們都知道是通過定位元素來實現(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的幾種常見操作整理

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容