摘要:3、三種等待方式,沒有選擇其中之一來使用,元素沒有被加載出來。這裏也是拿一號店來舉例,我們在進入一號店登錄頁面後,點擊QQ的方式來登錄,就會彈出新的窗口,這時候就需要切換到我們具體想要操作的窗口:。

作者 | 遇上方知友__QAQ
責編 | 王曉曼
出品 | CSDN博客
在自動化測試中,我們都知道是通過定位元素來實現的,那麼有時候我們定位元素定位不到是爲什麼呢?
1、頁面出現了 iframe;
2、出現了新的窗口,沒有實現句柄的切換;
3、三種等待方式,沒有選擇其中之一來使用,元素沒有被加載出來。
iframe
iframe 既是一個內聯框架被用來在當前 HTML 文檔中嵌入另一個文檔。
通俗點就是網頁中的嵌套網頁,如果我們在做自動化測試中,需要定位的元素包含在了iframe 內聯框架裏,那麼我們就需要跳進iframe ,如果說還需要做後續的操作,但後續的元素不在iframe 中,這時候就需要再跳出iframe 。
我們現在都知道了什麼是iframe ,那麼接下來我們拿126郵箱登錄做下示例。
我們看看網頁中的iframe 長什麼樣:
可以清楚的看到,當我把鼠標放到這裏時,iframe 元素的將整個登錄覆蓋到了,那麼這時候,就需要用到 Iframe 的跳入。
iframe 的跳入,我這裏簡單歸納了三種,其中兩種以126登錄爲例,一種爲一號店登錄方式爲QQ中的賬號密碼登錄。
方式一:
from selenium import webdriver
#實例化驅動
driver =webdriver.Chrome
#隱式等待:
driver.implicitly_wait(20)
# 打開網頁:
driver.get('https://www.126.com/')
#跳進iframe,根據獲取標籤名來通過下標跳進

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
#實例化驅動
driver =webdriver.Chrome
#隱式等待:
driver.implicitly_wait(20)
# 打開網頁:
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
#實例化驅動
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:
#循環查找符合條件的那一組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
#實例化驅動
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])
句柄打印結果:
如果還想要切換回去,那麼你就根據下標來切換就好啦。
Select下拉框
在自動化測試中,我們有三種方法可以進行下拉選擇:
這裏舉例攜程網中國內酒店的三個下拉框:
在下拉框中有三種定位方式:
方式一
代碼展示:
from selenium import webdriver
#實例化驅動
driver = webdriver.Chrome
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('https://www.ctrip.com/')
from selenium.webdriver.support.ui import Select #導入Select下拉框
#方式一: 根據index下標來選擇房間數:

#先定位到房間數
fj = driver.find_element_by_id('J_roomCountList')

#實例化select
select1 = Select(fj)

#根據下標來選擇房間數爲2的 因爲第一個下標爲0,房間數爲1,所以第二個下標爲1,房間數爲2
select1.select_by_index(1)
方式二,根據Value元素值來切換
元素信息展示:
代碼實現
from selenium import webdriver
#實例化驅動
driver = webdriver.Chrome
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('https://www.ctrip.com/')
from selenium.webdriver.support.ui import Select #導入Select下拉框
#方式二: 根據value值來選擇房間數:

#先定位到房間數
fj = driver.find_element_by_id('J_roomCountList')

#實例化select
select1 = Select(fj)

#根據元素value的值來進行房間數的切換,這裏切換爲value值2的,也是
#房間數爲2
select1.select_by_value('2')
方式三
使用 visible_text 文本信息輸入的方式來進行下拉框選擇:
代碼實現
from selenium import webdriver
#實例化驅動
driver = webdriver.Chrome
#隱式等待
driver.implicitly_wait(20)
#打開攜程頁面:
driver.get('https://www.ctrip.com/')
from selenium.webdriver.support.ui import Select #導入Select下拉框
#方式三: 根據文本內容來選擇房間數:

#先定位到房間數
fj = driver.find_element_by_id('J_roomCountList')

#實例化select
select1 = Select(fj)

#複製頁面中的文本信息就可以,使用visible_text方式
select1.select_by_visible_text('3間')
Alert彈窗處理
對頁面進行操作後,出現的彈窗提示進行處理。
這裏我拿首頁百度中的----設置—搜索設置–保存設置—對彈窗處理,這一個流程做示例;
首先要懸浮到這個元素:
點擊搜索設置,之後點擊保存設置,對彈窗進行處理。
在Alter中,有兩種處理方式,一個爲確定,一個爲取消。
對彈出框進行確定操作,代碼演示:
from selenium import webdriver
#實例化驅動
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
#點擊保存設置
'prefpanelgo').click
#對彈窗進行確定操作
alert = driver.switch_to.alert
alert.accept
對彈出框做取消操作
代碼演示:
#對彈窗進行取消操作
alert = driver.switch_to.alert
alert.dismiss
以上就是Selenium的幾種常見操作整理。
版權聲明:本文爲CSDN博主「遇上方知友__QAQ」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

相關文章