一、iframe操作
iframe識(shí)別:
語法:
driver.switch_to.frame(‘方式’)
1、常見處理方法三種
- index:下標(biāo)
- name:id或name屬性的值
- webelement:元素
2、通過下標(biāo)進(jìn)入
進(jìn)入第一個(gè)iframe:
driver.switch_to.frame(0)
3、通過id或name屬性的值進(jìn)入
通過id或name屬性的值進(jìn)入指定的iframe:
driver.switch_to.frame('iframe')
driver.switch_to.frame('iframeName')
4、通過iframe元素進(jìn)入iframe
通過iframe元素進(jìn)入指定iframe:
iframe=driver.find_element(By.ID,"iframe")
driver.switch_to.frame(iframe)
完整案例代碼如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("http://localhost:8080/iframeDemo.html")
# 通過下標(biāo)進(jìn)入frame
driver.switch_to.frame(0)
# 通過id或name屬性的值進(jìn)入指定的iframe
driver.switch_to.frame('iframe')
driver.switch_to.frame('iframeName')
# 通iframe元素進(jìn)入iframe
iframe=driver.find_element(By.ID,"iframe")
driver.switch_to.frame(iframe)
driver.find_element(By.ID,'user').clear()
driver.find_element(By.ID,'user').send_keys("this is a frame test !")
print(driver.find_element(By.ID,'user').get_attribute('value'))
二、select下拉框操作
1、select控件識(shí)別
常見操作有兩種:一步到位,二次管控!
2、一步到位
一步到位: 直接定位元素點(diǎn)擊即可,示例如下:
# 一步到位,直接選擇內(nèi)蒙
driver.find_element(By.CSS_SELECTOR,"[value='0015']").click()
print(driver.find_element(By.CSS_SELECTOR,"[value='0015']").text)
3、二次管控
二次管控: 先定位select框,再定位select里的選項(xiàng),通過Select對(duì)象進(jìn)行強(qiáng)轉(zhuǎn),來調(diào)用select控件中的Api來達(dá)到操作的目的。
常見操作方法:
- select_by_index():通過下標(biāo)選擇對(duì)應(yīng)項(xiàng)
- select_by_value():通過value選擇對(duì)應(yīng)項(xiàng)
- select_by_visible_text():通過可見文本選擇對(duì)應(yīng)項(xiàng)
示例代碼如下:
select = Select(driver.find_element(By.ID, "select"))
# 選擇第一個(gè)選項(xiàng)
select.select_by_index(0)
# 調(diào)用first_selected_option就能獲取當(dāng)前下拉框選中值啦
print(select.first_selected_option.text)
sleep(2)
# 選擇典韋
select.select_by_value("3")
# 調(diào)用first_selected_option就能獲取當(dāng)前下拉框選中值啦
print(select.first_selected_option.text)
sleep(2)
# 選擇凱
select.select_by_visible_text("凱")
# 調(diào)用first_selected_option就能獲取當(dāng)前下拉框選中值啦
print(select.first_selected_option.text)
4、遍歷所有選項(xiàng)
示例代碼如下:
示例代碼如下:
# 打印所有選項(xiàng)的text
for option in select.options:
print("選項(xiàng)為:"+option.text)
完整代碼示例:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("http://localhost:8080/SelectDemo.html")
# 一步到位,直接選擇典韋
# driver.find_element(By.CSS_SELECTOR,"[value='3']").click()
# print(driver.find_element(By.CSS_SELECTOR,"[value='3']").text)
select = Select(driver.find_element(By.ID, "select"))
# 選擇第一個(gè)選項(xiàng)
select.select_by_index(0)
# 調(diào)用first_selected_option就能獲取當(dāng)前下拉框選中值啦
print(select.first_selected_option.text)
sleep(2)
# 選擇典韋
select.select_by_value("3")
# 調(diào)用first_selected_option就能獲取當(dāng)前下拉框選中值啦
print(select.first_selected_option.text)
sleep(2)
# 選擇凱
select.select_by_visible_text("凱")
# 調(diào)用first_selected_option就能獲取當(dāng)前下拉框選中值啦
print(select.first_selected_option.text)
# 打印所有選項(xiàng)的text
for option in select.options:
print("選項(xiàng)為:"+option.text)
sleep(2)
三、交互操作彈出框的處理
1、彈出框分類:
彈出框分為兩種,一種基于原生JavaScript寫出來的彈窗,另一種是自定義封裝好的樣式的彈出框,即原生JavaScript寫出來的彈窗,另一種彈窗用click()基本就能搞定。 原生JavaScript寫出來的彈窗又分為三種:
alert
confirm
prompt
2、彈窗處理常用方法:
alert/confirm/prompt彈出框操作主要方法有:
driver.switch_to.alert:切換到alert彈出框上
alert.text:獲取文本值
accept() :點(diǎn)擊"確認(rèn)"
dismiss():點(diǎn)擊"取消"或者關(guān)閉對(duì)話框
send_keys() :輸入文本值 --僅限于prompt,在alert和confirm上沒有輸入框
alert彈窗處理
示例代碼如下:
# alert彈窗處理
driver.find_element(By.ID,"alert").click()
alert=driver.switch_to.alert
print(alert.text)
# 確定
alert.accept()
sleep(2)
confirm彈窗處理
示例代碼如下:
# dialog對(duì)話框處理
driver.find_element(By.ID,"dialog").click()
alert=driver.switch_to.alert
print(alert.text)
# 取消操作
alert.dismiss()
sleep(2)
prompt彈窗處理
# 彈窗輸入框
driver.find_element(By.ID,"welcome").click()
alert=driver.switch_to.alert
print(alert.text)
alert.send_keys("input 框")
alert.accept()
sleep(2)
print(alert.text)
四、執(zhí)行Js操作
在做web自動(dòng)化時(shí),有些情況selenium的api無法完成,需要通過第三方手段比如js來完成實(shí)現(xiàn),比如去改變某些元素對(duì)象的屬性或者進(jìn)行一些特殊的操作,本文將來講解怎樣來調(diào)用JavaScript完成特殊操作。
1、用法
driver.execute_script(js語句)
2、模擬場景
場景1
打開百度首頁,并彈窗提示hellow,world!,關(guān)閉彈窗,控制臺(tái)輸出彈窗文本hellow,world! 示例代碼如下:
# 執(zhí)行js語句
driver.execute_script("alert('hellow,world!')")
alert=driver.switch_to.alert
print(alert.text)
# 確定
alert.accept()
場景2
示例代碼如下:
# 將百度按鈕改成MyLove
element = driver.find_element(By.ID, "su");
driver.execute_script("document.getElementById('su').setAttribute('value', 'MyLove');", element);
效果如下:
3、模擬滾動(dòng)條操作
在寫腳本時(shí),總會(huì)遇到一種情況,就是當(dāng)滾動(dòng)拉倒最下面了,表單或者下拉框、按鈕這些元素未在當(dāng)前頁面展示,而webdriver提供的方法都是操作當(dāng)前頁面可見的元素,這時(shí)我們使用JavaScript操作瀏覽器的滾動(dòng)條,滾動(dòng)后使頁面元素可見,就可完成后面的元素操作了。
核心思路:
就是使用js去控制瀏覽器滾動(dòng)條的位置,在使用selenium調(diào)用JavaScript操作js完成。
下面舉例幾種常用滾動(dòng)條的js代碼示例如下:
//拖動(dòng)滾動(dòng)條至底部
document.documentElement.scrollTop=10000
window.scrollTo(0,document.body.scrollHeight)
//拖動(dòng)滾動(dòng)條至頂部
document.documentElement.scrollTop=0
arguments[0].scrollIntoView(false);
//左右方向的滾動(dòng)條可以使用window.scrollTo(左邊距,上邊距)方法
window.scrollTo(200,1000)
實(shí)際案例
以博客園我的文章列表頁為例,來演示滾動(dòng)條操作,具體代碼如下:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.cnblogs.com/longronglang/")
driver.maximize_window()
# 獲取第一篇文章列表元素
element = driver.find_element(By.CSS_SELECTOR,".forFlow [role='article']:nth-of-type(1) .vertical-middle")
sleep(2)
# 將頁面滾動(dòng)條拖到底部
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
# 將滾動(dòng)條滾動(dòng)至第三篇文章列表位置
driver.execute_script("arguments[0].scrollIntoView(true)", element)
sleep(2)
# 將滾動(dòng)條滾動(dòng)到頂部
driver.execute_script("arguments[0].scrollIntoView(false)", element)
sleep(2)
# 將滾動(dòng)條滾動(dòng)到指定位置
driver.execute_script("window.scrollTo(200,1000)")
五、Cookie操作之完美繞過驗(yàn)證碼
下面我們就使用cookie操作,繞過登錄驗(yàn)證碼
還是以博客園為例,下面本文來介紹下如何繞過下圖驗(yàn)證碼,進(jìn)入博客園
1、工具準(zhǔn)備
- Fiddler.exe
- IDEA/Eclipse
- selenium的cookie操作
2、使用Fiddler抓包
一般登陸網(wǎng)站成功后,會(huì)生成一個(gè)已登錄狀態(tài)的cookie,那么只需要直接把這個(gè)值拿到,用selenium進(jìn)行addCookie操作即可。
可以先手動(dòng)登錄一次,然后抓取這個(gè)cookie,這里我們就需要用抓包工具fiddler了
先打開博客園登錄界面,手動(dòng)輸入賬號(hào)和密碼(不要點(diǎn)登錄按鈕)
打開fiddler抓包工具,此時(shí)再點(diǎn)博客園登錄按鈕
登錄成功后,再查看cookie變化,發(fā)現(xiàn)多了兩組參數(shù),多的這兩組參數(shù)就是我們想要的,copy出來,一會(huì)有用
3、cookie操作語法
driver.add_cookie()
add_cookie(cookie_dict)方法里面參數(shù)是cookie_dict,說明里面參數(shù)是字典類型。
源碼官方文檔介紹:
add_cookie(self, cookie_dict)
Adds a cookie to your current session.
Args:
- cookie_dict: A dictionary object, with required keys - "name" and "value";
optional keys - "path", "domain", "secure", "expiry"
Usage:
driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
從官方的文檔里面可以看出,添加cookie時(shí)候傳入字典類型就可以了,等號(hào)左邊的是name,等號(hào)左邊的是value。
把前面抓到的兩組數(shù)據(jù)(參數(shù)不僅僅只有name和value),寫成字典類型:
{'name':'.CNBlogsCookie','value':'2C3AE01E461B2D2F1572D02CB936D77A053089AA2xxxx...'}
{'name':'.Cnblogs.AspNetCore.Cookies','value':'CfDJ8Mmb5OBERd5FqtiQlKZZIG4HKz_Zxxx...'}
4、完整示例代碼文章來源:http://www.zghlxwxcb.cn/news/detail-767637.html
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.cnblogs.com/longronglang/")
# 添加cookie
c1 = {u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 15412950521,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
c2 = {u'domain': u'.cnblogs.com',
u'name': u'.Cnblogs.AspNetCore.Cookies',
u'value': u'xxxx',
u'expiry': 15412950521,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
# 添加2個(gè)值
driver.add_cookie(c1)
driver.add_cookie(c2)
time.sleep(3)
# 刷新下頁面就見證奇跡了
driver.refresh()
# 再來個(gè)登錄后操作
driver.find_element_by_link_text(u"博客園").click()
driver.find_element_by_link_text("Refain").click()
效果圖
注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-767637.html
- 登錄時(shí)候要勾選下次自動(dòng)登錄按鈕。
- addCookie()只添加name和value,對(duì)于博客園的登錄是不成功。
- 本方法并不適合所有的網(wǎng)站,一般像博客園這種記住登錄狀態(tài)的才會(huì)適合。
到了這里,關(guān)于Selenium4+Python3 - Iframe、Select控件、交互式彈出框、執(zhí)行JS、Cookie操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!