seleium新版

image

官網(wǎng)文檔

Selenium 官方參考文檔:http://selenium-python.readthedocs.io/index.html

安裝

安裝客戶端

pip install selenium

PyPI 網(wǎng)站下載 Selenium庫(kù)https://pypi.python.org/simple/selenium

安裝瀏覽器驅(qū)動(dòng)

下載谷歌瀏覽器

下載瀏覽器驅(qū)動(dòng)

https://chromedriver.storage.googleapis.com/index.html
我的存放位置D:\webdrivers\chromedriver.exe
browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe')

下載解壓好的chromediver.exe文件放進(jìn)python安裝路徑下的scripts文件夾里
browser = webdriver.Chrome()
irefox瀏覽器驅(qū)動(dòng):geckodriver
Chrome瀏覽器驅(qū)動(dòng):chromedriver,taobao備用地址
IE瀏覽器驅(qū)動(dòng):IEDriverServer
Edge瀏覽器驅(qū)動(dòng):MicrosoftWebDriver
Opera瀏覽器驅(qū)動(dòng):operadriver
PhantomJS瀏覽器驅(qū)動(dòng):phantomjs

3個(gè)檢測(cè)瀏覽器User-Agent信息的網(wǎng)站為:
  1. http://whatsmyuseragent.com/
  2. http://whatsmyua.com/
  3. http://www.useragentstring.com/

代碼

導(dǎo)入的包
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time

from selenium.webdriver.chrome.options import Options
指定瀏覽器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()                                         # 網(wǎng)上找到 你可以試試
options.binary_location = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"   # 這里是你指定瀏覽器的路徑
driver = webdriver.Chrome(chrome_options=options) 
driver.get('http://www.baidu.com')
帶界面
from selenium import webdriver
## 創(chuàng)建 WebDriver 對(duì)象,指明使用chrome瀏覽器驅(qū)動(dòng)
browser= webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
# 調(diào)用WebDriver 對(duì)象的get方法 可以讓瀏覽器打開指定網(wǎng)址
browser.get('https://www.baidu.com')
不帶界面
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options=Options()
#不帶界面
chrome_options.add_argument('--headless')
#不加載圖片
chrome_options.add_argument('blink-settings=imagesEnabled=false')
browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe',options=self.chrome_options)
browser.get('https://www.baidu.com')
讀取和使用cookies

https://www.cnblogs.com/superhin/p/11481803.html

選擇元素的基本方法
# 獲取id標(biāo)簽值
element = driver.find_element_by_id("passwd-id")
# 獲取name標(biāo)簽值
element = driver.find_element_by_name("user-name")
# 獲取標(biāo)簽名值
element = driver.find_elements_by_tag_name("input")
# 也可以通過(guò)XPath來(lái)匹配
element = driver.find_element_by_xpath("http://input[@id='passwd-id']")

find_element_by_xpath()用法

find_element_by_xpath('//ul/li').text   #獲取文本
find_element_by_xpath('//ul/li').get_attribute("href")  #獲取去元素,獲取href元素

補(bǔ)充

find_elements_by_link_text (全部文本)
find_elements_by_partial_link_text (包含某個(gè)文本)

ID屬性選擇元素

find_element_by_id("id名") //符合條件所有ID名
find_elements_by_id("id名") //符合條件第一個(gè)ID名

class屬性選擇元素

find_elements_by_class_name('類名') //符合條件所有類名
find_element_by_class_name('類名') //符合條件第一個(gè)類名

tag名選擇元素

find_elements_by_tag_name('div') //選擇所有的tag名為 div的元素
find_element_by_tag_name('div') //選擇第一個(gè)tag名為div的元素

css選擇元素

find_element_by_css_selector(CSS Selector參數(shù))
find_elements_by_css_selector(CSS Selector參數(shù))

CSS Selector用法

CSS Selector 同樣可以根據(jù)tag名、id 屬性和 class屬性 來(lái) 選擇元素

#取tag名
find_elements_by_css_selector('div')
#取id
find_element_by_css_selector('#id')  #加#號(hào)
#取class
find_elements_by_css_selector('.class')  #加.號(hào)
#其他屬性
find_element_by_css_selector('[)
find_element_by_css_selector("div[class='SKnet']") #div標(biāo)簽class值
find_element_by_css_selector('a[href*="miitbeian"]')  #a標(biāo)簽href包含的值
find_element_by_css_selector('a[href^="http"]')  #a標(biāo)簽href以http開頭
find_element_by_css_selector('a[href$="gov.cn"]')  #a標(biāo)簽href以gov.cn結(jié)尾
#<div class="misc" ctype="gun">沙漠之鷹</div>
find_element_by_css_selector('div[class=misc][ctype=gun]')  #一個(gè)標(biāo)簽多個(gè)屬性
CSS Selector選擇語(yǔ)法聯(lián)合使用

更多CSS選擇器:https://www.w3school.com.cn/cssref/css_selectors.asp

選擇下級(jí)
#選擇 一個(gè)class 屬性值為 copyright 的 span 節(jié)點(diǎn), 
#并且要求其 必須是 class 屬性值為 footer1 的 div節(jié)點(diǎn) 的子節(jié)點(diǎn)
div.footer1 > span.copyright  
#也可以更簡(jiǎn)單
.footer1 > .copyright
#或
.footer1  .copyright
同時(shí)選擇
#同時(shí)選擇所有class 為 plant 和 class 為 animal 的元素
'.plant , .animal'

#同時(shí)選擇所有tag名為div的元素 和 id為BYHY的元素
'div,#BYHY'

#選擇所有 id 為 t1 里面的 span 和 p 元素
'#t1 > span , #t1 > p'
#對(duì)應(yīng)的代碼如下
elements = wd.find_elements_by_css_selector('div,#BYHY')
for element in elements:
   print(element.text)
按次序選擇子節(jié)點(diǎn)
#指定選擇的元素 是父元素的第幾個(gè)子節(jié)點(diǎn)
span:nth-child(2)  #第2個(gè)子元素,并且是span類型
#指定選擇的元素 是父元素的倒數(shù)第幾個(gè)子節(jié)點(diǎn)
p:nth-last-child(1)  #倒數(shù)2個(gè)子元素,并且是span類型

#父元素的第幾個(gè) 某類型的 子節(jié)點(diǎn)
span:nth-of-type(1)  #選擇的是 第1個(gè)span類型 的子元素
#父元素的 倒數(shù)第幾個(gè)某類型 的子節(jié)點(diǎn)
p:nth-last-of-type(2)  #選擇的是 倒數(shù)第1個(gè)span類型 的子元素

#父元素的 偶數(shù)節(jié)點(diǎn),使用 nth-child(even)
p:nth-child(even)  父元素的 偶數(shù)節(jié)點(diǎn)
span:nth-of-type(even)  #某類型偶數(shù)節(jié)點(diǎn)
#如果要選擇的是父元素的 奇數(shù)節(jié)點(diǎn),使用 nth-child(odd)
p:nth-child(odd)  #父元素的 奇數(shù)節(jié)點(diǎn)
p:nth-last-of-type(odd)  #某類型奇數(shù)節(jié)點(diǎn)
image.png
兄弟節(jié)點(diǎn)選擇
#相鄰兄弟 關(guān)系,可以這樣寫 h3 + span
#表示元素 緊跟關(guān)系的 是 加號(hào)

#選擇 h3 后面所有的兄弟節(jié)點(diǎn) span,可以這樣寫 h3 ~ span

text //取文本內(nèi)容
clear() //清除輸入框已有的字符串

send_keys('輸入內(nèi)容') //輸入新的字符串
click() //點(diǎn)擊

獲取元素內(nèi)容

element = wd.find_element_by_id('input_name')
print(element.get_attribute('class'))

get_attribute('class') //獲取元素的值
get_attribute('outerHTML') //獲取整個(gè)元素對(duì)應(yīng)的HTML文本內(nèi)容
get_attribute('innerHTML') //獲取某個(gè)元素內(nèi)部的HTML文本內(nèi)容
get_attribute('value') //獲取輸入框的文本(input輸入框文本)

//有時(shí)候,元素的文本內(nèi)容沒(méi)有展示在界面上,或者沒(méi)有完全完全展示在界面上。 這時(shí),用WebElement對(duì)象的text屬性,獲取文本內(nèi)容,就會(huì)有問(wèn)題。
(get_attribute('innerText') 或 get_attribute('textContent'))

find_element 和 find_elements 的區(qū)別

使用 find_elements 選擇的是符合條件的 所有 元素, 如果沒(méi)有符合條件的元素, 返回空列表

使用 find_element 選擇的是符合條件的 第一個(gè) 元素, 如果沒(méi)有符合條件的元素, 拋出 NoSuchElementException 異常

通過(guò)WebElement對(duì)象選擇元素

  • 不僅 WebDriver對(duì)象有 選擇元素 的方法, WebElement對(duì)象 也有選擇元素的方法
  • WebElement對(duì)象 也可以調(diào)用 find_elements_by_xxx,find_element_by_xxx 之類的方法
  • WebDriver 對(duì)象 選擇元素的范圍是 整個(gè) web頁(yè)面, 而WebElement 對(duì)象 選擇元素的范圍是 該元素的內(nèi)部。
from selenium import webdriver

wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')

wd.get('http://cdn1.python3.vip/files/selenium/sample1.html')

element = wd.find_element_by_id('container')

# 限制 選擇元素的范圍是 id 為 container 元素的內(nèi)部。
spans = element.find_elements_by_tag_name('span')
for span in spans:
    print(span.text)

等待界面出現(xiàn)

implicitly_wait如果找不到元素, 每隔 半秒鐘 再去界面上查看一次, 直到找到該元素, 或者 過(guò)了10秒 最大時(shí)長(zhǎng)

from selenium import webdriver

wd = webdriver.Chrome()

# 設(shè)置最大等待時(shí)長(zhǎng)為 10秒
wd.implicitly_wait(10)

wd.get('https://www.baidu.com')

element = wd.find_element_by_id('kw')

element.send_keys('黑羽魔巫宗\n')

element = wd.find_element_by_id('1')

print (element.text)

異常結(jié)束

NoSuchElementException 的意思就是在當(dāng)前的網(wǎng)頁(yè)上 找不到該元素

frame切換/窗口切換

使用 WebDriver 對(duì)象的 switch_to 屬性,像這樣
frame_reference 可以是 frame 元素的屬性 name 或者 ID 。

wd.switch_to.frame(`frame_reference`)

也可以根據(jù)frame的元素位置或者屬性獲取

wd.switch_to.frame(wd.find_element_by_tag_name("iframe"))
切換回主html
wd.switch_to.default_content()
切換到新的窗口

在網(wǎng)頁(yè)上操作的時(shí)候,我們經(jīng)常遇到,點(diǎn)擊一個(gè)鏈接 或者 按鈕,就會(huì)打開一個(gè) 新窗口 。

from selenium import webdriver
browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe')
browser.get('http://cdn1.python3.vip/files/selenium/sample3.html')
link = browser.find_element_by_tag_name("a")
link.click()

#mainWindow變量保存當(dāng)前窗口的句柄
mainWindow = browser.current_window_handle

for handle in browser.window_handles:
    browser.switch_to.window(handle)
    if 'Bing' in browser.title:
        break
print(browser.title)

browser.switch_to.window(mainWindow)

print(browser.title)

WebDriver 鼠標(biāo)鍵盤事件

https://www.cnblogs.com/Skyyj/p/6687028.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容