一、瀏覽器基本操作
1.1 、 啟動
方法 | 作用 |
---|---|
Chrome() | 啟動瀏覽器,不同瀏覽器方法名不一樣 |
get() | 打開某個網頁,網頁地址以參數傳入方法 |
quit() | 關閉瀏覽器 |
不同瀏覽器啟動方法
# # Firefox 火狐瀏覽器
# driver = webdriver.Firefox()
#
# # 谷歌瀏覽器
# driver = webdriver.Chrome()
#
# # ie 瀏覽器
# driver = webdriver.Ie()
#
# # Edge 瀏覽器
# driver = webdriver.Edge()
#
# # Opera 瀏覽器
# driver = webdriver.Opera()
#
# # PhantomJS瀏覽器
# driver = webdriver.PhantomJS()
from selenium import webdriver
# 指定驅動位置
path = "D:\\chromedriver.exe"
# 啟動瀏覽器
driver = webdriver.Chrome(executable_path=path)
# 打開一個網頁 如:百度
driver.get("http://www.baidu.com/")
# 關閉瀏覽器
driver.quit()
1.2、 瀏覽器窗口的操作
方法 | 作用 |
---|---|
maximize_window() | 窗口最大化 |
minimize_window() | 窗口最小化 |
fullscreen_window() | 全屏化窗口 |
set_window_size(width,height) | 設置瀏覽器大小 |
set_window_position(x,y) | 指定瀏覽器位置 |
# 窗口最大化
driver.maximize_window()
# 等待3秒
sleep(3)
# 窗口最小化 等於看不見
driver.minimize_window()
sleep(3)
# 窗口全屏化
driver.fullscreen_window()
sleep(3)
# 設置窗口大小 寬度,高度
driver.set_window_size(300,200)
sleep(3)
# 指定窗口位置 寬度,高度 以左上角 為坐標
driver.set_window_position(100,150)
sleep(3)
1.3 、網頁基本操作
方法 | 作用 |
---|---|
forward() | 前進 |
back() | 后退 |
refresh() | 刷新 |
closs() | 關閉 |
from selenium import webdriver
from time import sleep
options = webdriver.ChromeOptions()
# 指定驅動
driver_path = "D:\\drivers\\chromedriver.exe"
driver = webdriver.Chrome(driver_path,options=options)
# 先打開百度網頁
driver.get("http://www.baidu.com")
# 等待五秒
sleep(3)
# 在打開東方財富網
driver.get("https://www.eastmoney.com/")
# 然后 后退 到百度
driver.back()
# 等待3秒
sleep(3)
# 在刷新一下
driver.refresh()
# 給1秒的緩沖
sleep(1)
# 在前進到 東方財富網
driver.forward()
#關閉網頁
driver.close()
二、元素定位
我們對網頁的各種操作,其實都是對前端元素的操作,那你想實現自動化操作,首要就是查找你要操作的元素,只有匹配到元素才能實現后續的操作。
selenium 元素定位有八種方式
方法 | 作用 |
---|---|
find_element_by_id() | 根據id屬性定位 |
find_element_by_name() | 根據name屬性定位元素 |
find_element_by_link_text() | 根據超鏈接的文字信息 |
find_element_by_partial_link_text() | 根據超鏈接的部分文字信息 |
find_element_by_tag_name() | 根據tag名稱 |
find_element_by_class_name() | 根據class名稱 |
find_element_by_xpath() | 根據xpath表達式 |
find_element_by_css_selector() | 根據css選擇器 |
注:
find_element_by_xx
如果沒有匹配到元素,則執行報錯
如果匹配到一個元素,則返回元素
如果匹配到多個元素,則返回元素
find_elements_by_xx
如果沒有匹配到元素,則返回空列表
如果匹配到一個元素,則返回包含一個元素的列表
如果匹配到多個元素,則返回包含多個元素的列表
2.1、 id定位
id 屬性在html文件里具有唯一性,是我們優先使用的一種方法
from seleniumimport webdriver
d= webdriver.Chrome()
d.get('https://www.baidu.com')
d.find_element_by_id("kw").send_keys("hello")
2.2 、name 定位
from seleniumimport webdriver
d= webdriver.Chrome()
d.get('https://www.baidu.com')
d.find_element_by_name("wd").send_keys("hello")
2.3、 calss 定位
from seleniumimport webdriver
d= webdriver.Chrome()
d.get('https://www.baidu.com')
d.find_element_by_class_name('s_ipt').send_keys('hello')
# 復合class 如:class="bg s_ipt_wr quickdelete-wrap" ,有多個calss屬性由空格隔開,我們只能取其中一個
d.find_element_by_class_name('s_ipt_wr')
2.4、 tag 定位
我們就知道HTML是通過tag來定義功能的,比如input是輸入,table是表格,等等...。每個元素其實就是一個tag,一個tag往往用來定義一類功能,我們查看百度首頁的html代碼,可以看到有很多重復的div,input,a等tag, 多個tag的時候 我們要用find_elements_by_tag_name() 他返回的是一個列表 ,我們要對這個列表選索引值進行操作 在我們工作中較少用這種定義方法,僅了解就行。
from selenium import webdriver
d = webdriver.Chrome("D:\\chromedriver.exe")
d.get("http://www.baidu.com")
d.find_element_by_tag_name("area").click()
2.5、link_text
link_text 是我們定位一個超鏈接最常用的,我們的元素值就是這個超鏈接的文本 ,精確匹配
from seleniumimport webdriver
import time # 調了一個時間模塊
d= webdriver.Chrome()
d.get('https://www.baidu.com')
d.find_element_by_link_text('新聞').click()
time.sleep(5) # 讓等待5秒
d.quit()
2.6、 partial_link_text
partial_link_text 也用來定位超鏈接 ,只不過他與link_text 精確匹配不同 他是 一個模糊匹配
from selenium import webdriver
from time import sleep
options = webdriver.ChromeOptions()
# 指定驅動
driver_path = "D:\\drivers\\chromedriver.exe"
driver = webdriver.Chrome(driver_path,options=options)
# 先打開百度網頁
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
sleep(1)
driver.find_element_by_id("su").click()
sleep(3)
# 模糊查找 selenium中文網 並點擊一下
driver.find_element_by_partial_link_text("selenium中文網").click()
sleep(5)
driver.quit()
2.7、 xpath 定位,路徑表達式定位
前面介紹的幾種定位方法都是在理想狀態下,有一定使用范圍的,那就是:在當前頁面中,每個元素都有一個唯一的id或name或class或超鏈接文本的屬性,那么我們就可以通過這個唯一的屬性值來定位他們。但是在實際工作中並非有這么美好,有時候我們要定位的元素並沒有id,name,class屬性,或者多個元素的這些屬性值都相同,又或者刷新頁面,這些屬性值都會變化。那么這個時候我們就只能通過xpath或者CSS來定位了。
2.7.1 路徑
絕對路徑:從根節點開始,到目標位置
xpathstr ="/html/body/div[1]/div[1]/div/form/span[1]/input"
d.find_element_by_xpath(xpathstr)
特點:路徑唯一,但是通常比較深,容易受頁面改動影響
相對路徑:從任意位置,或當前位置開始
xpathstr ="//input[@id='kw']"
d.find_element_by_xpath(xpathstr)
特點:書寫形式靈活多樣,推薦使用
2.7.2 相對匹配方式
下面是相對路徑幾種方式介紹
根據標簽類型定位
xpathstr ="//input" 這樣寫是匹配input類型的所有元素
根據順序定位:
xpathstr ="//inputp[2]" 有層級中的第二個input元素
xpathstr ="//div[last()-1] 查找頁面上各個層級中倒數第二個div元素
根據元素屬性定位:
xpathstr ="//input[@value]" input類型的標簽,並且有value屬性的元素
xpathstr ="//input[@value = 'kw']" input類型value值為kw 的元素
使用運算符:
xpathstr ="//input[@value='kw' and @ id='ad'] input類型value屬性值為kw 並且id屬性為 ad的元素
xpathstr ="//input[@maxlength <256]" maxlength值小於256的input元素
層級與屬性結合定位
xpathstr = "//form/input" form元素下的input子元素
xpathstr = "//div[@class]/a[3]" div的第三個a標簽元素,div具有class屬性
使用通配符
xpathstr = "//tools/*" 選出所有的tools所有的子元素
xpathstr = "//*[@*="s_tab"]" 任意類型,任意屬性值為's_tab'的元素
模糊匹配
xpathstr = "//a[contains(@href,'logout')]" 使用contains函數進行部分匹配
xpathstr = "//a[contains(text(),退出)]" 超鏈接文本內容包括"退出字符"
xpath
更多可以參考:https://www.w3school.com.cn/xpath/index.asp
from seleniumimport webdriver
import time
d= webdriver.Chrome()
d.get('https://www.baidu.com')
# 定位搜索框,然后輸入hello
d.find_element_by_xpath('//*[@id="kw"]').send_keys('hello')
time.sleep(5)
d.quit()
2.8、 css_selector 定位
css定位相對比xpath要簡潔些,定位速度也要快些,selenium也比較推薦這種方式,但是學習起來會比較難理解,因為他有太多的樣式,這里介紹一下比較簡單常用的幾種方式
選擇器 | 例子 | 描述 |
---|---|---|
#id | #firstname | 選擇 id="firstname" 的元素。 |
.class | .intro | 選擇 class="intro" 的所有元素。 |
element>element | div > p | 選擇父元素是 <div> 的所有 <p> 元素。 |
[attribute=value] | [target=_blank] | 選擇帶有 target="_blank" 屬性的所有元素。 |
更多可參考:https://www.w3school.com.cn/cssref/css_selectors.asp
from selenium import webdriver
import time
d = webdriver.Chrome()
d.get('https://www.baidu.com')
# 加斷言,若在直接就下一步 不會有什么反應,如果不在 就會報錯
assert '百度' in d.title
# 先清除一下搜索框
d.find_element_by_css_selector('#kw').clear()
d.find_element_by_css_selector('#kw').send_keys('hello')
time.sleep(5)
d.quit()
在介紹兩種現在比較推薦的方法
from selenium import webdriver
from selenium.webdriver.common.by import By
d = webdriver.Chrome("D:\\chromedriver.exe")
d.get("http://www.baidu.com")
d.find_element(By.ID,"kw").send_keys("selenium")
d.find_elements(By.NAME,"wd")[0].send_keys("selenium")