- ??專注于分享軟件測試干貨內(nèi)容,歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正!
- ??交流討論:歡迎加入我們一起學習!
- ??資源分享:耗時200+小時精選的「軟件測試」資料包
- ?? 軟件測試學習教程推薦:火遍全網(wǎng)的《軟件測試》教程
這里是清安,本章一起來了解一下ifame標簽,iframe多用于嵌套頁面。最常見的就是登錄窗口了。例如QQ空間,知乎的登錄界面,都有用到。本章主要以QQ空間為例,一起來看看:
進入Url:https://i.qq.com/。
方法一:按下F12,鼠標點擊登錄框,審查元素,就能看到iframe框了。
方法二:按下F12,CTRL+F,在搜索框中輸入iframe,也能搜索到。
簡單的小腳本
好了, 此處看了iframe標簽了。我們?nèi)绾蝸矶ㄎ荒?。上述圖片中有id,有name屬性,所以我們正常進行定位切換就好了。
?
from selenium import webdriver
fox = webdriver.Firefox()
fox.get("https://i.qq.com/")
# 定位標簽
ifranme = fox.find_element_by_id('login_frame')
# 切換到標簽上
fox.switch_to.frame(ifranme)
fox.find_element_by_id('switcher_plogin').click()
fox.find_element_by_id('u').send_keys('清安無別事')
fox.find_element_by_id('p').send_keys('歡迎入坑')
fox.quit()
?
此處是一個小例子,我們使用switch_to.frame()可以切入到標簽內(nèi)部,然后進行各種操作。實際上可能會遇見沒有任何屬性的iframe,所以這時候就要考慮到標簽定位了。這里回到了元素定位基礎(chǔ)了,就不作多的闡述了。
往后還可能遇到一個HTML中存在多個iframe標簽的情況,善于結(jié)合Python,Selenium基礎(chǔ)來書寫代碼。原理都是一樣的。
封裝iframe講解
那么切入進去之后如何切出呢,或者還有其他的辦法切入嗎。答案是有的??捶庋b好的一個小例子。這里就不解釋如何封裝的了,可以直接看看Python系列,有講。
?
# -->>>清安<<<---
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class Test(object):
def __init__(self):
self.fox = webdriver.Firefox()
self.fox.get('https://i.qq.com/')
def get_element(self, ele, local):
return self.fox.find_element(ele, local)
def click_(self, ele, local):
self.get_element(ele, local).click()
def get_text(self, *local):
sleep(1)
txt = self.get_element(*local)
print(txt.text)
def frame_(self, ele, local):
"""
:return: 切入frame
"""
sleep(1)
self.fox.switch_to.frame(self.get_element(ele, local))
def parent_frame(self):
"""
:return: 切出frame
"""
sleep(1)
# self.fox.switch_to.default_content()
self.fox.switch_to.parent_frame()
def wait_(self):
"""
:return: 顯示等待頭部
"""
return WebDriverWait(self.fox, 10, 0.5)
def wait_frame(self, ele, local):
"""
:return: 顯示等待+iframe標簽的使用
"""
self.wait_().until(EC.frame_to_be_available_and_switch_to_it(self.get_element(ele, local)),
message='iframe不可跳轉(zhuǎn)')
if __name__ == '__main__':
t = Test() # 實例化類,直接打開url
t.frame_(By.ID, 'login_frame') # 定位iframe標簽
t.get_text(By.ID, 'switcher_plogin') # 獲取文本信息
t.click_(By.ID, 'switcher_plogin') # 點擊操作
t.get_text(By.ID, 'login_button') # 獲取文本信息
t.parent_frame() # 切出iframe
t.get_text(By.XPATH, "http://*[text()='空間活動']") # 獲取文本信息
t.wait_frame(By.ID, 'login_frame') # 用iframe顯示等待
t.get_text(By.XPATH, '//*[text()="新用戶注冊"]') # 獲取文本信息
此處舉例了如何切出iframe,也就是parent_frame方法,里面介紹了兩種方法。
self.fox.switch_to.parent_frame()是切換到父級,如果沒有父級的iframe,那么保持默認,也就是說將焦點切出原iframe標簽。
self.fox.switch_to.default_content()會直接將焦點切出iframe標簽。
切出后我們就可以做其他的操作了。上述代碼中,我們定位了“空間活動”,并打印了它的文本值。
上述代碼中我們還用到了一個顯示等待,也是有關(guān)iframe標簽的,這也是一種切換方式。一起來看看源碼:
class frame_to_be_available_and_switch_to_it(object):
""" An expectation for checking whether the given frame is available to
switch to. If the frame is available it switches the given driver to the
specified frame.
"""
def __init__(self, locator):
self.frame_locator = locator
def __call__(self, driver):
try:
if isinstance(self.frame_locator, tuple):
driver.switch_to.frame(_find_element(driver,
self.frame_locator))
else:
driver.switch_to.frame(self.frame_locator)
return True
except NoSuchFrameException:
return False
?看源碼中,簡單點理解:如果self.frame_locator是元組,則進行切換,否則,還是切換,并返回True。都不對,則告訴你錯誤,返回False。所以啊,用了這個顯示等待也就不需要另外寫iframe標簽切換了。也能不加強制等待、擔心時間不夠元素沒渲染出來,導致腳本報錯了。
總結(jié)
1、上述的封裝中,并未用到較多的顯示等待,而是簡單的使用了強制等待,這是不值得提倡的。
2、封裝的套路可以模仿,自己寫一寫。
3、大家記得寫好注釋
4、上述代碼中,切換iframe還有很大的優(yōu)化空間,可以自己試試如何優(yōu)化
最后我邀請你進入我們的軟件測試學習交流群:785128166, 大家可以一起探討交流軟件測試,共同學習軟件測試技術(shù)、面試等軟件測試方方面面,還會有免費直播課,收獲更多測試技巧,我們一起進階Python自動化測試/測試開發(fā),走向高薪之路
感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關(guān)注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
?文章來源:http://www.zghlxwxcb.cn/news/detail-773773.html
這些資料,對于從事【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!
文章來源地址http://www.zghlxwxcb.cn/news/detail-773773.html
到了這里,關(guān)于Selenium中操作iframe,別再說你不會了的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!