作者 | 遇上方知友__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')breakdriver.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')breakdriver.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:#循環查找符合條件的那一組iframeif 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')#實例化selectselect1 = Select(fj)#根據下標來選擇房間數為2的 因為第一個下標為0,房間數為1,所以第二個下標為1,房間數為2select1.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')#實例化selectselect1 = Select(fj)#根據元素value的值來進行房間數的切換,這裡切換為value值2的,也是#房間數為2select1.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')#實例化selectselect1 = 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()#點擊保存設置driver.find_element_by_class_name('prefpanelgo').click()#對彈窗進行確定操作alert = driver.switch_to.alertalert.accept()
對彈出框做取消操作
代碼演示:
#對彈窗進行取消操作alert = driver.switch_to.alertalert.dismiss()
以上就是Selenium的幾種常見操作整理。
版權聲明:本文為CSDN博主「遇上方知友__QAQ」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_46457203/article/details/106164117