(二)selenium 瀏覽器常用操作_八種元素定位


一、瀏覽器基本操作

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()

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() 

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")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM