一、瀏覽器驅(qū)動下載
Selenium需要瀏覽器驅(qū)動程序才能與所選瀏覽器交互。例如,F(xiàn)irefox需要安裝geckodriver。確保它在PATH中。
主流瀏覽器驅(qū)動下載地址如下:
瀏覽器 | 驅(qū)動名稱 | 打開方式及注意事項 | 地址 |
---|---|---|---|
Chrome | chromedriver |
driver = webdriver.Chrome() 下載瀏覽器對應(yīng)版本的chromedriver.exe 一定要創(chuàng)建對象,不然打開會閃退?。?! |
https://registry.npmmirror.com/binary.html?path=chromedriver |
Firefox | geckodriver |
webdriver.Firefox() 下載最新版本的geckodriver.exe |
https://github.com/mozilla/geckodriver/releases |
Edge | MicrosoftWebDriver |
driver = webdriver.Edge() 最好在官網(wǎng)下載對應(yīng)版本的瀏覽器:https://www.microsoft.com/en-us/edge,然后下載瀏覽器對應(yīng)版本的msedgedriver.exe 一定要創(chuàng)建對象,不然打開會閃退?。?! windows10運行代碼時:將msedgedriver.exe重命名為MicrosoftWebDriver.exe,不然運行程序會報錯?。?! windows11運行代碼時:msedgedriver.exe不要重命名?。?! |
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver |
IE | IEDriverServer |
webdriver.Ie() 下載selenium對應(yīng)版本的IEDriverServer.exe |
https://registry.npmmirror.com/binary.html?path=selenium |
具體,可以查看:chromedriver、geckodriver、MicrosoftWebDriver、IEDriverServer和operadriver之間的恩怨糾葛
ps:最新版chromedriver的下載地址:
https://googlechromelabs.github.io/chrome-for-testing/#stable
二、selenium-python安裝(打開網(wǎng)站、操作元素)
1.安裝
pip install -U selenium
注:-U
就是指定下載最新版本的selenium
2. 控制瀏覽器
2.1 打開瀏覽器
from selenium import webdriver
# 打開瀏覽器
driver = webdriver.Chrome()
或者,可以指定驅(qū)動路徑:
driver = webdriver.Chrome(executable_path=r'D:\Program Files\Python36\chromedriver.exe')
關(guān)閉瀏覽器及其對應(yīng)驅(qū)動:
driver.quit()
還可以通過上下文來控制其執(zhí)行操作后自動關(guān)閉:
with webdriver.Chrome(executable_path='chromedriver.exe') as driver:
driver......
2.2 打開網(wǎng)站
driver.get('https://blog.csdn.net/testleaf/article/details/123269042')
延時3秒:
import time
time.sleep(3)
2.3 定位元素
傳說中的八大元素定位方法:
driver.find_element_by_id() # 通過id屬性定位(唯一);常用
driver.find_element_by_xpath() # 通過xpath表達式定位;常用
driver.find_element_by_class_name() # 通過類名定位;常用
driver.find_element_by_name() # 通過name屬性定位
driver.find_element_by_tag_name() # 通過標簽名定位
driver.find_element_by_css_selector() # 通過css選擇器定位
driver.find_element_by_link_text() # 通過鏈接標簽的text類容定位
driver.find_element_by_partial_link_text() # 通過匹配鏈接標簽的text類容定位
上面的都是找到第一個元素,每一個方法都有對應(yīng)多個元素的方法:
如:driver.find_elements_by_id()
示例1:
driver.find_element_by_id(“toolbar-search-input”)
示例2:
driver.find_element_by_name(“wd”)
2.4 操作元素
# 定位搜索框
element = driver.find_element_by_id("toolbar-search-input")
# 輸入搜索內(nèi)容
element.send_keys('web自動化框架:selenium入門')
# 定位搜索按鈕
search_button = driver.find_element_by_id('toolbar-search-button')
# 點擊搜索按鈕
search_button.click()
三、網(wǎng)頁解析(HTML、xpath)
1.HTML
HTML【Hyper Text Markup Language】:超文本標記語言,不是編程語言,用來描述網(wǎng)頁的。也稱為:網(wǎng)頁的源碼、html源碼、html文檔、document。
具體,可以查看:
網(wǎng)頁的源碼,html源碼,html文檔,document
HTML常用標簽
HTML示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#table {
border: 1px solid
}
.th {
font-size: 20px
}
</style>
</head>
<body>
<div>我是一個div標簽</div>
<h1>我是一個大<span style="color:red">標簽</span></h1>
<p></p>
<a href="https://blog.csdn.net/testleaf">testleaf</a>
<table id="table">
<thead>
<tr>
<th class="th aaa">字段1</th>
<th class="th">字段2</th>
<th class="th">字段3</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</tbody>
</table>
<form action="">
<p>用戶名: <input type="text"></p>
<p>密碼:<input type="password"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
2.xpath
xpath:一個解析html/xml的語言。
- 語法
- 選取節(jié)點
- nodename 選取此節(jié)點的所有子節(jié)點
- / 從根節(jié)點選取
- // 從匹配選擇的當(dāng)前節(jié)點選擇文檔中的節(jié)點,不考慮它們的位置
- . 選取當(dāng)前節(jié)點
- … 表示選取當(dāng)前節(jié)點的父節(jié)點,如:
//div[@class="active"]/..
- @ 選取屬性
- 案例
-
//div
獲取文檔中的所有的div
-
- 謂語 用來查找特定的節(jié)點,或者包含指定值的節(jié)點
- 謂語被包裹在中括號中
//div[@class="active"]
//div[@class="active" and @id="kw"]
//div[@class="active" or @id="kw"]
//div[@class="active"]/span[last()]
- 軸 用來查找相對于當(dāng)前節(jié)點的節(jié)點
- 使用語法 軸名稱::節(jié)點名稱[謂語]
- ancestor 選取當(dāng)前節(jié)點的所有父輩節(jié)點
- parent 選取當(dāng)前節(jié)點的父節(jié)點
- 如:
//div[@class="active"]/child::book
- …詳見 https://www.w3school.com.cn/xpath/xpath_axes.asp
- 函數(shù)
- text() 元素的text內(nèi)容
//li[text()="強烈推薦"]
- contains(@屬性名/text(), value)包含的內(nèi)容
//li[contains(@class, "ls")]
- text() 元素的text內(nèi)容
- 選取節(jié)點
在瀏覽器中進行驗證:
$x('//div')
四、selenium基本操作
Pycharm-Terminal操作:
IPYTHON
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.quit()
exit()
瀏覽器-Console操作:
window.scrollTo(0,100)
1、元素定位八種方法
傳說中的八大元素定位方法:
driver.find_element_by_id() # 通過id屬性定位(唯一);常用
driver.find_element_by_xpath() # 通過xpath表達式定位;常用
driver.find_element_by_class_name() # 通過類名定位;常用
driver.find_element_by_name() # 通過name屬性定位
driver.find_element_by_tag_name() # 通過標簽名定位
driver.find_element_by_css_selector() # 通過css選擇器定位
driver.find_element_by_link_text() # 通過鏈接標簽的text類容定位
driver.find_element_by_partial_link_text() # 通過匹配鏈接標簽的text類容定位
以上方法只會返回匹配到的第一個元素;
返回的是 selenium.webdriver.remote.webelement.WebElement的對象;
返回多個元素在element后加s即可,例如:driver.find_elements_by_xpath()
,使用時要小心;
凡是elements
的方法返回的是列表;
from selenium import webdriver
driver = webdriver.Chrome()
# 打開百度頁面
driver.get('https://www.baidu.com')
# 1. 獲取搜索框
search_input = driver.find_element_by_id('kw')
print(type(search_input))
print('1.搜索框的name屬性值=', search_input.get_attribute('name'))
# 2. 搜索按鈕
search_btn = driver.find_element_by_xpath('//input[@value="百度一下"]')
print('2.搜索按鈕的id=', search_btn.get_attribute('id'))
# 3. 百度logo
logo = driver.find_element_by_class_name('index-logo-src')
print('3.百度logo的src=', logo.get_attribute('src'))
# 4. 通過name屬性定位搜索框
search_input_by_name = driver.find_element_by_name('wd')
print('4.搜索框的id=', search_input_by_name.get_attribute('id'))
# 5. 熱搜榜中的鏈接
hot_ul = driver.find_element_by_xpath('//ul[@id="hotsearch-content-wrapper"]')
# hot_ul = driver.find_element_by_xpath('//ul[@text()="熱榜"]')
hot_a_s = hot_ul.find_element_by_tag_name('a')
print('5.熱搜榜第一的標題是:', hot_a_s.text)
# 6. 通過css選擇器定位搜索框
search_input_by_css = driver.find_element_by_css_selector('#kw')
print('6.搜索框的name=', search_input_by_css.get_attribute('name'))
# 7. 新聞欄目
el_a = driver.find_element_by_link_text('新聞')
print('7.新聞欄目的url=', el_a.get_attribute('href'))
# 8. 通過部分text匹配新聞欄目
el_a1 = driver.find_element_by_partial_link_text('新')
print('8.新聞欄目的url=', el_a1.get_attribute('href'))
driver.quit()
2、元素動態(tài)定位
問題:元素的定位方式不確定,可能是id,可能是xpath,需要通過不同的方式動態(tài)指定定位方法;
辦法:加判斷語句,不需要我們寫,selenium底層定位就是這么做的;
driver.find_element(by,value)
driver.find_elements(by,value)
by: 定位方式
value: 定位表達式
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 打開百度頁面
driver.get('https://www.baidu.com')
id_loc = 'kw'
xpath_loc = '//input[@id="kw"]'
e1 = driver.find_element(By.ID, id_loc)
# send_keys往輸入框輸入文本
e1.send_keys('我通過id定位')
time.sleep(3)
# e2 = driver.find_element(By.XPATH, xpath_loc)
e2 = driver.find_element('xpath', xpath_loc)
e2.clear() # 清空原有內(nèi)容
e2.send_keys('我通過xpath定位')
time.sleep(3)
driver.quit()
3、iframe切換
當(dāng)頁面中包含iframe時,不能直接操作iframe中的元素,需要先切換進iframe才行;
selenium通過driver.switch_to.frame(frame_reference)
來切換;
selenium切換iframe有三種方式:
- 1.通過webelement:
- 使用webelement進行切換是最靈活的選擇,先定位到iframe然后切換到它;
- 2.通過name或id:
- iframe一般都會有id或name屬性,則可以使用該屬性進行切換,如果name或id在頁面上不唯一,name將切換到找到的第一個;
- 3.通過iframe在頁面中的索引進行切換(從0開始):
- 在瀏覽器console調(diào)試工具中使用
window.ampInaboxIframes
可以查詢當(dāng)前頁面中的iframe;退出iframe:driver.switch_to.default_content()
;
- 在瀏覽器console調(diào)試工具中使用
import time
from selenium import webdriver
# 使用with語句進行上下文管理
# 異常時也會關(guān)閉瀏覽器驅(qū)動
with webdriver.Chrome() as driver:
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_form_radio')
# 切換iframe
# 1. webelement的方式
# 先獲取到iframe
iframe = driver.find_element_by_id('iframeResult')
# 再切換到
driver.switch_to.frame(iframe)
# 2. name/id的方式
# 直接通過name/id切換
driver.switch_to.frame('iframeResult')
# 3. 使用索引
# 切換到第二個iframe
time.sleep(1)
driver.switch_to.frame(1)
# 找到female單選框
female = driver.find_element_by_xpath('//input[@value="female"]')
print(female)
# 4. 離開iframe,回到主頁面
driver.switch_to.default_content()
driver.find_element_by_xpath('//a[text()="運行代碼"]')
4、填充表單_填充文本框
import time
from selenium import webdriver
with webdriver.Chrome() as driver:
driver.get('https://www.baidu.com')
# 搜索框定位
search_input = driver.find_element_by_id('kw')
# element.send_keys(string)輸入文本
# 所有可輸入的標簽都適用
search_input.send_keys('軟件測試')
# 搜索按鈕定位
search_btn = driver.find_element_by_xpath('//input[@value="百度一下"]')
# 點擊
# element.click()點擊
search_btn.click()
time.sleep(3)
5、填充表單_單選按鈕
import time
from selenium import webdriver
with webdriver.Chrome() as driver:
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_form_radio')
# 切換iframe
iframe = driver.find_element_by_id('iframeResult')
driver.switch_to.frame(iframe)
# 找到female單選框
female = driver.find_element_by_xpath('//input[@value="female"]')
# 在元素上點擊
female.click() # 選中
time.sleep(5)
6、填充表單_下拉列表
下拉框有兩種處理方法:
(1)直接定位到要選中的option選項,然后點擊
(2)通過selenium.webdriver.support.ui.Select類
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
with webdriver.Chrome() as driver:
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select')
# 切換iframe
iframe = driver.find_element_by_id('iframeResult')
driver.switch_to.frame(iframe)
# 找到audi選項
# 1. 通過option直接操作
option = driver.find_element_by_xpath('//option[@value="audi"]')
option.click()
time.sleep(1)
# 2. 通過select類
# 找到select
select = Select(driver.find_element_by_xpath('//select[@name="cars"]'))
#
# # 選中索引為1的選項,索引從0開始
select.select_by_index(1)
time.sleep(1)
#
# # 選中value等于audi的選項
select.select_by_value('audi')
time.sleep(1)
#
# # 選中option的文本為Volvo的選項
select.select_by_visible_text('Volvo')
time.sleep(3)
7、切換窗口和標簽頁
webdriver 不區(qū)分窗口和標簽頁。打開一個新的標簽頁或者窗口,selenium會使用窗口句柄來處理它。
每個窗口都有一個唯一的標識符,該標識符在單個會話中保持持久性。
(1)獲取當(dāng)前窗口句柄:driver.current_window_handle
;
(2)切換窗口或標簽頁:通過循環(huán)遍歷的方式來切換;
import time
from selenium import webdriver
with webdriver.Chrome() as driver:
driver.get('https://www.baidu.com')
# 找到搜索框
search_input = driver.find_element_by_id('kw')
search_input.send_keys('圖片')
# 點擊搜索按鈕
driver.find_element_by_id('su').click()
time.sleep(1)
# 獲取原窗口的handle
original_window = driver.current_window_handle
print('當(dāng)前窗口句柄', original_window)
print('窗口的title', driver.title)
# 選取第一個結(jié)果并點擊
driver.find_element_by_xpath('//div[@id="3001"]//a').click()
# time.sleep(1)
for handle in driver.window_handles:
if handle != original_window:
# 切換到新窗口
driver.switch_to.window(handle)
break
# 打印當(dāng)前窗口句柄
print('新打開的搜索頁面句柄', driver.current_window_handle)
print('新打開的頁面的title', driver.title)
time.sleep(5)
8、顯式等待
瀏覽器渲染頁面的時候需要時間,如果沒有渲染完成就對元素進行定位將會找不到到該元素;
所以需要加延時進行等待,有三種等待方式:
(1)time.sleep()
前面已經(jīng)反復(fù)使用了;等待時間固定,不穩(wěn)定;等待時間多半不確定;
(2)顯式等待
顯式等待就是在元素操作前循環(huán)判斷操作的條件是否滿足,滿足后再操作;
selenium通過selenium.webdriver.support.ui.WebDriverWait
類的對象來實現(xiàn)顯式等待;webDriverWait類實例化時可以接收3個參數(shù):
- driver: webdriver對象
- timeout:超時時間,最多等待多少秒
- poll_frequency: 檢查頻率,默認0.5秒
until方法接受1個參數(shù):
- conditions:條件在
selenium.webdriver.support.expected_conditions
模塊中;
常見條件:
presence_of_element_located:元素存在于dom中
visibility_of_element_located:元素可見
element_to_be_clickable:元素可點擊
element_to_be_selected:元素可選擇
實例化條件需要傳入一個定位參數(shù),是一個二元元組:(by, loc_expression)
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import selenium.webdriver.support.expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get('https://www.baidu.com')
# 找到搜索框
search_input = driver.find_element_by_id('kw')
search_input.send_keys('圖片')
# 點擊搜索按鈕
driver.find_element_by_id('su').click()
# 獲取原窗口的id
original_window = driver.current_window_handle
print('當(dāng)前窗口句柄', original_window)
print('窗口的title', driver.title)
# 選取第一個結(jié)果并點擊
#
# WebDriverWait(driver, timeout=3).until(
# EC.visibility_of_element_located((By.XPATH, '//div[@id="3001"]//a'))
# ).click()
s_time = time.time()
btn = WebDriverWait(driver, timeout=3).until(
EC.visibility_of_element_located((By.ID, '3001'))
)
btn.click()
e_time = time.time()
print(e_time-s_time)
# WebDriverWait(driver, timeout=3).until(
# EC.visibility_of_element_located(('id', '3001'))
# ).click()
# 會等待id為3001的元素可見,timeout=3表示最多等待3秒鐘,超時就拋出異常
# driver.find_element_by_xpath('//div[@id="3001"]//a').click()
# time.sleep(1)
for handle in driver.window_handles:
if handle != original_window:
# 切換到新窗口
driver.switch_to.window(handle)
break
# 打印當(dāng)前窗口句柄
print('新打開的搜索頁面句柄', driver.current_window_handle)
print('新打開的頁面的title', driver.title)
time.sleep(5)
9、隱式等待
(3)隱式等待
隱式等待本質(zhì)上是設(shè)置了一個全局等待時間,WebDriver在試圖查找任何元素時都會輪詢一定時間,默認情況下隱式等待是禁用的。
警告:不要混用隱式等待和顯示等待,這樣會導(dǎo)致不可預(yù)測的等待時間。
例如:隱式等待設(shè)置10秒,顯式等待設(shè)置15秒,可能導(dǎo)致在20秒后發(fā)生超時;
隱式等待是告訴WebDriver如果在查找一個或多個不是立即可用的元素時輪詢DOM一段時間。默認設(shè)置為0,表示禁用。一旦設(shè)置好,隱式等待就會被設(shè)置為會話的生命周期。
import time
from selenium import webdriver
with webdriver.Chrome() as driver:
# 設(shè)置隱式等待5秒
driver.implicitly_wait(5)
driver.get('https://www.baidu.com')
# 找到搜索框
search_input = driver.find_element_by_id('kw')
search_input.send_keys('圖片')
# 點擊搜索按鈕
driver.find_element_by_id('su').click()
# 獲取原窗口的id
original_window = driver.current_window_handle
print('當(dāng)前窗口句柄', original_window)
print('窗口的title', driver.title)
# 選取第一個結(jié)果并點擊
driver.find_element_by_xpath('//div[@id="3001"]//a').click()
for handle in driver.window_handles:
if handle != original_window:
# 切換到新窗口
driver.switch_to.window(handle)
break
# 打印當(dāng)前窗口句柄
print('新打開的搜索頁面句柄', driver.current_window_handle)
print('新打開的頁面的title', driver.title)
time.sleep(5)
10、警告框
WebDriver提供了一個API,用于處理JavaScript提供的三種類型的原生彈窗消息
(1)Alerts警告框
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_alert')
driver.switch_to.frame('iframeResult')
button = WebDriverWait(driver, timeout=3).until(
EC.visibility_of_element_located(('xpath', '//button')))
# 有時候需要結(jié)合sleep來處理
# time.sleep(1)
button.click()
# time.sleep(3)
# 等待alert彈出
alert = WebDriverWait(driver, timeout=3).until(EC.alert_is_present())
# time.sleep(1)
# alert = driver.switch_to.alert
# 獲取彈出框文本
text = alert.text
print(text)
time.sleep(1)
# # 確認
alert.accept()
time.sleep(1)
11、confirm確認框
(2) confirm確認框
與警告框不同,確認框還有取消按鈕;
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_confirm')
driver.switch_to.frame('iframeResult')
button = WebDriverWait(driver, timeout=3).until(
EC.visibility_of_element_located(('xpath', '//button')))
button.click()
# # 等待confirm彈出
WebDriverWait(driver, timeout=3).until(EC.alert_is_present())
#
# # 獲取alert
alert = driver.switch_to.alert
#
# # 獲取彈出框文本
text = alert.text
print(text)
time.sleep(2)
# # 取消
# 點擊取消后 當(dāng)前的alert對象就會被銷毀
alert.dismiss()
# alert.accept() 確認
time.sleep(2)
12、prompt提示框
(3)prompt提示框
還可以輸入文本;
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_prompt')
driver.switch_to.frame('iframeResult')
button = WebDriverWait(driver, timeout=3).until(
EC.visibility_of_element_located(('xpath', '//button')))
# 避免js沒有綁定出現(xiàn)意外問題,加一秒延時
time.sleep(1)
button.click()
# 等待alert彈出
WebDriverWait(driver, timeout=3).until(EC.alert_is_present())
# 獲取alert
alert = driver.switch_to.alert
# 輸入信息
alert.send_keys('testleaf')
time.sleep(3)
# 確認
alert.accept()
# alert.dismiss() 取消
time.sleep(3)
13、鼠標操作動作鏈
鼠標是通過使用底層接口執(zhí)行的,需要調(diào)用ActionChains
對象來執(zhí)行對應(yīng)的方法。
(1)clickAndHold
:它將移動到該元素,然后在給定元素的中間單擊(不釋放);
(2)contextClick
:此方法首先將鼠標移動到元素的位置, 然后在給定元素執(zhí)行上下文點擊(右鍵單擊);
(3)doubleClick
:它將移動到該元素, 并在給定元素的中間雙擊;
(4)moveToElement
:此方法將鼠標移到元素的中間. 執(zhí)行此操作時, 該元素也會滾動到視圖中;
(5)moveByOffset
:此方法將鼠標從其當(dāng)前位置(或0,0)移動給定的偏移量. 如果坐標在視圖窗口之外, 則鼠標最終將在瀏覽器窗口之外;
(6)dragAndDrop
:此方法首先在源元素上單擊并按住,然后移動到目標元素的位置后釋放鼠標;
(7)release
:此操作將釋放按下的鼠標左鍵. 如果WebElement轉(zhuǎn)移了, 它將釋放給定WebElement上按下的鼠標左鍵;
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get(r'file://D:\project\action.html')
div = WebDriverWait(driver, timeout=3).until(EC.visibility_of_element_located(('xpath', '//div[@οnmοuseοver="mOver(this)"]')))
# 移動到指定元素 move_to_element
webdriver.ActionChains(driver).move_to_element(div).perform()
time.sleep(2)
# 移開多大位置x,y move_by_offset
webdriver.ActionChains(driver).move_by_offset(xoffset=500, yoffset=500).perform()
time.sleep(2)
# 點住不放 click_and_hold
div = driver.find_element_by_xpath('//div[@οnmοusedοwn="mDown(this)"]')
webdriver.ActionChains(driver).click_and_hold(div).perform()
time.sleep(2)
# 松開鼠標 release
webdriver.ActionChains(driver).release(div).perform()
time.sleep(2)
# double_click 雙擊
button = driver.find_element_by_xpath('//button[@ondblclick]')
webdriver.ActionChains(driver).double_click(button).perform()
time.sleep(2)
# drag 將div1拖拽到div2上
div1 = driver.find_element_by_id('draggable')
div2 = driver.find_element_by_id('droppable')
webdriver.ActionChains(driver).drag_and_drop(div1, div2).perform()
time.sleep(3)
# contextClick 點擊鼠標右鍵
div = driver.find_element_by_xpath('//div[@οnmοusedοwn="whichButton(event)"]')
webdriver.ActionChains(driver).context_click(div).perform()
time.sleep(2)
14、執(zhí)行js代碼_滾動1
selenium執(zhí)行js有幾個方法,這里我們使用最常用的方法execute_script;
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get('https://image.baidu.com')
search_input = WebDriverWait(driver, 3).until(EC.visibility_of_element_located(('id', 'kw')))
search_input.send_keys('軟件測試')
WebDriverWait(driver, 3).until(EC.element_to_be_clickable(('xpath', '//input[@value="百度一下"]'))).click()
time.sleep(3)
# 滾動到(0px,100px)的位置
driver.execute_script("window.scrollTo(0,100)")
time.sleep(1)
driver.execute_script("window.scrollTo(0,200)")
time.sleep(1)
driver.execute_script("window.scrollTo(0,300)")
time.sleep(3)
# 移動到底部
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(3)
# 移動到頂部
driver.execute_script("window.scrollTo(0,0)")
time.sleep(3)
15、執(zhí)行js代碼_滾動2
selenium執(zhí)行js有幾個方法,這里我們使用最常用的方法execute_script
;
執(zhí)行js時,還可以傳遞參數(shù)給js腳本;
下面的案例:
打開頁面,并滾動到指定的元素可見為止;
下面的代碼 div 被傳遞給了arguments,通過切片的方式可以取出;
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
driver.get(r'file://D:\project\scroll.html')
time.sleep(2)
div = driver.find_element_by_xpath('//div')
# 移動到元素的底端與當(dāng)前窗口的底部對齊
driver.execute_script("arguments[0].scrollIntoView(false);", div)
time.sleep(2)
# 移動到元素的頂端與當(dāng)前窗口的頂端對齊
driver.execute_script("arguments[0].scrollIntoView();", div)
time.sleep(2)
16、上傳操作_input上傳
selenium只支持input元素的上傳,直接使用send_keys將文件絕對地址寫入元素即可;
import time
from selenium import webdriver
with webdriver.Chrome() as driver:
driver.get('https://www.baidu.com')
span = driver.find_element_by_xpath('//span[@class="soutu-btn"]')
span.click()
time.sleep(1)
input = driver.find_element_by_xpath('//input[@class="upload-pic"]')
input.send_keys(r'D:\project\find.jpg')
# 有可能還需要提交的操作,百度是不需要
time.sleep(10)
17、上傳操作_非input上傳_pywinauto
很多時候頁面不是使用input來進行文件上傳,這是就需要通過其他第三方包來操作系統(tǒng)界面;
(1)pywinauto
缺點: 只能在windwows上使用;
優(yōu)點:可以選擇多個文件,路徑中有中文也可以;
import time
from selenium import webdriver
from pywinauto.keyboard import send_keys
with webdriver.Chrome() as driver:
driver.get('https://www.baidu.com')
span = driver.find_element_by_xpath('//span[@class="soutu-btn"]')
span.click()
time.sleep(1)
# select_span = driver.find_element_by_xpath('//span[text()="選擇文件"]')
select_span = driver.find_element_by_xpath('//div[@class="upload-wrap"]')
# 點擊打開選擇文件窗口
select_span.click()
time.sleep(3)
# 選擇文件
send_keys(r'D:\project\find.jpg')
time.sleep(1)
# # 選擇確定
send_keys('{ENTER}')
time.sleep(10)
18、上傳操作_非input上傳_pyautogui
很多時候頁面不是使用input來進行文件上傳,這里就需要通過其他第三方包來操作系統(tǒng)界面;
(2)pyautogui
缺點: 只能選擇一個文件,文件路徑有中文會出問題;
優(yōu)點:跨平臺(windows,mac,linux);
import time
from selenium import webdriver
import pyautogui
with webdriver.Chrome() as driver:
driver.get('https://www.baidu.com')
span = driver.find_element_by_xpath('//span[@class="soutu-btn"]')
span.click()
time.sleep(1)
# select_span = driver.find_element_by_xpath('//span[text()="選擇文件"]')
select_span = driver.find_element_by_xpath('//div[@class="upload-wrap"]')
# 點擊打開選擇文件窗口
select_span.click()
time.sleep(3)
# 選擇文件
pyautogui.write(r"D:\project\find.jpg")
time.sleep(1)
# 選擇確定
pyautogui.press('enter', 2)
time.sleep(10)
五、selenium調(diào)整窗口大小
selenium調(diào)整窗口到指定大小:
driver.set_window_size(900,1000)
瀏覽器最大化:
driver.maximize_window()
六、判斷元素是否允許被操作
driver.find_element_by_name("XXX").is_enabled() # 是否可以編輯,或者按鈕是否可以點擊
driver.find_element_by_name("XXX").is_displayed() # 判斷元素是否顯示
element=driver.find_element_by_name("XXX").is_selected() # 判斷元素是否選中狀態(tài)
七、獲取某個元素的html
driver.find_element_by_id('XXX').get_attribute('innerHTML')
八、其他問題
1、svg定位
問題描述:
使用xpath方法對svg下元素進行定位,會發(fā)現(xiàn)無法定位到svg下的元素:
driver.find_element(xpath,"/html/body/div[19]/svg")
解決方法1【錯誤】:
從svg元素開始,下面的元素都要以*[name()=‘svg element’]
這種形式進行編寫
driver.find_element(xpath,"/html/body/div[19]/*[name()='svg']/*[name()='path']")
會發(fā)現(xiàn)仍然定位不到;
解決辦法2【正確】:
絕對路徑的話,*[name()='svg']
前面得加雙斜杠,不然定位不到:
driver.find_element(xpath,"/html/body/div[19]//*[name()='svg']")
相對路徑的話,*[name()='svg']
前就不用加雙斜杠,只用單斜杠:
driver.find_element(xpath,"http://*[@id='userinfo']/*[name()='svg']/*[name()='use']")
2、處理chrome顯示通知彈框
使用chrome打開weibo.com會出現(xiàn)以下界面的彈出框:
這東西不屬于頁面alert彈框,而是屬于瀏覽器的設(shè)置項。
要關(guān)掉它,需要對瀏覽器進行屬于配置。具體見下面腳本:
from selenium import webdriver
options = webdriver.ChromeOptions()
prefs = {
'profile.default_content_setting_values':{
'notifications':2
}
}
options.add_experimental_option('prefs',prefs)
driver = webdriver.Chrome(options = options)
driver.get("https://blog.csdn.net/testleaf/article/details/123269042")
3、獲取元素的文本
①element.text
②get_attribute(“textContent”)
優(yōu)點:可以獲取隱藏元素的文本
缺點:IE不支持;獲取有些元素的文本時,結(jié)果中帶有空字符串;(沒有嘗試過)
③get_attribute("innerText")
優(yōu)點:可以獲取隱藏元素的文本
缺點:FireFox不支持;(每個博客能搜到的都說這個缺點,但實際操作發(fā)現(xiàn)可以獲取到每次所需的文本)
4、切換網(wǎng)址
直接進行切換就可以了,如下:文章來源:http://www.zghlxwxcb.cn/news/detail-674801.html
driver.get('https://blog.csdn.net/testleaf/article/details/123269042')
time.sleep(2)
driver.get('https://blog.csdn.net/testleaf/article/details/123302863')
5、find_element_by_xpath()被棄用解決方案
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome() #啟動chromedriver
driver.get('http://www.baidu.com') #打開http://www.baidu.com
driver.find_element(By.XPATH,'//div[@class="detail-item-ctn"][1]').click() #點擊按鈕
免責(zé)聲明:
1.編寫此文是為了更好地學(xué)習(xí)selenium的使用,如果損害了有關(guān)人的利益,請聯(lián)系刪除;
2.如果文中描述欠妥,請在評論中進行指正;
3.文字編寫不易,若感覺有用,點贊收藏關(guān)注會讓博主很開心哦;
4.此外,本文支持任何形式的轉(zhuǎn)載,轉(zhuǎn)載請注明出處,非常感謝?。?!
本文源自:https://blog.csdn.net/testleaf/article/details/123269042文章來源地址http://www.zghlxwxcb.cn/news/detail-674801.html
到了這里,關(guān)于web自動化框架:selenium學(xué)習(xí)使用操作大全(Python版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!