欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲之selenium模塊

 更新時(shí)間:2022年06月02日 14:34:45   作者:springsnow  
本文詳細(xì)講解了python爬蟲之selenium模塊,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、什么是Selenium

selenium 是一套完整的web應(yīng)用程序測試系統(tǒng),包含了測試的錄制(selenium IDE),編寫及運(yùn)行(Selenium Remote Control)和測試的并行處理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。

selenium可以模擬真實(shí)瀏覽器,自動(dòng)化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。

二、selenium安裝

用python寫爬蟲的時(shí)候,主要用的是selenium的Webdriver,我們可以通過下面的方式先看看Selenium.Webdriver支持哪些瀏覽器

from selenium import webdrive
help(webdriver)

執(zhí)行結(jié)果如下,從結(jié)果中我們也可以看出基本山支持了常見的所有瀏覽器:

NAME: selenium.webdriver

PACKAGE CONTENTS:

  • android (package)
  • blackberry (package)
  • chrome (package)
  • common (package)
  • edge (package)
  • firefox (package)
  • ie (package)
  • opera (package)
  • phantomjs (package)
  • remote (package)
  • safari (package)
  • support (package)
  • webkitgtk (package)

VERSION: 3.14.1

1、PhantomJS: 無可視化界面的瀏覽器(無頭瀏覽器)

PhantomJS是一個(gè)而基于WebKit的服務(wù)端JavaScript API,支持Web而不需要瀏覽器支持,其快速、原生支持各種Web標(biāo)準(zhǔn):Dom處理,CSS選擇器,JSON等等。

PhantomJS可以用用于頁面自動(dòng)化、網(wǎng)絡(luò)監(jiān)測、網(wǎng)頁截屏,以及無界面測試。

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

當(dāng)selenium升級(jí)到3.0之后,對(duì)不同的瀏覽器驅(qū)動(dòng)進(jìn)行了規(guī)范。如果想使用selenium驅(qū)動(dòng)不同的瀏覽器,必須單獨(dú)下載并設(shè)置不同的瀏覽器驅(qū)動(dòng)。

各瀏覽器下載地址:

:webdriver需要和對(duì)應(yīng)的瀏覽器版本以及selenium版本對(duì)應(yīng)。

查看驅(qū)動(dòng)和瀏覽器版本的映射關(guān)系:

按照chrome版本對(duì)應(yīng)的driver,直接按照瀏覽器版本去找對(duì)應(yīng)的driver(只對(duì)應(yīng)大版本就行)

下載之后,解壓到任意目錄(路徑不要有中文)。

瀏覽器驅(qū)動(dòng)文件,(win環(huán)境下載解壓后得到的.exe文件)需要放到與python.exe同級(jí)目錄中方能使用?;蛘吲渲秒娔X環(huán)境變量

可以手動(dòng)創(chuàng)建一個(gè)存放瀏覽器驅(qū)動(dòng)的目錄,如: C:\driver , 將下載的瀏覽器驅(qū)動(dòng)文件(例如:chromedriver、geckodriver)丟到該目錄下。

我的電腦-->屬性-->系統(tǒng)設(shè)置-->高級(jí)-->環(huán)境變量-->系統(tǒng)變量-->Path,將“C:\driver”目錄添加到Path的值中。

三、selenium基本使用

1、聲明瀏覽器對(duì)象

上面我們知道了selenium支持很多的瀏覽器,但是如果想要聲明并調(diào)用瀏覽器則需要:

這里只寫了兩個(gè)例子,當(dāng)然了其他的支持的瀏覽器都可以通過這種方式調(diào)用

from selenium import webdriver

browser = webdriver.Chrome()
# browser = webdriver.Firefox()

Headless方式啟動(dòng)

Headless Chrome 是 Chrome 瀏覽器的無界面形態(tài),可以在不打開瀏覽器的前提下,使用所有 Chrome 支持的特性運(yùn)行你的程序。相比于現(xiàn)代瀏覽器,Headless Chrome 更加方便測試 web 應(yīng)用,獲得網(wǎng)站的截圖,做爬蟲抓取信息等。相比于較早的 PhantomJS,SlimerJS 等,Headless Chrome 則更加貼近瀏覽器環(huán)境。

Headless Chrome 對(duì)Chrome版本要求:官方文檔中介紹,mac和linux環(huán)境要求chrome版本是59+,而windows版本的chrome要求是60+,同時(shí)chromedriver要求2.30+版本。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

chrome_options = webdriver.ChromeOptions()
# 使用headless無界面瀏覽器模式
chrome_options.add_argument('--headless') //增加無界面選項(xiàng)
chrome_options.add_argument('--disable-gpu') //如果不加這個(gè)選項(xiàng),有時(shí)定位會(huì)出現(xiàn)問題
# 啟動(dòng)瀏覽器,獲取網(wǎng)頁源代碼
browser = webdriver.Chrome(chrome_options=chrome_options)
mainUrl = "https://www.taobao.com/"
browser.get(mainUrl)
print(f"browser text = {browser.page_source}")
browser.quit()

2、訪問頁面

下面代碼運(yùn)行后,會(huì)自動(dòng)打開Chrome瀏覽器,并登陸百度打印百度首頁的源代碼,然后關(guān)閉瀏覽器

from selenium import webdriver

browser = webdriver.Chrome()

browser.get("http://www.baidu.com")
print(browser.page_source)
browser.close()

3、查找元素

1、單個(gè)元素查找

browser.get(<a  rel="external nofollow"  rel="external nofollow"   target="_blank">http://www.taobao.com</a>)
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
browser.close()

這里我們通過三種不同的方式去獲取響應(yīng)的元素,第一種是通過id的方式,第二個(gè)中是CSS選擇器,第三種是xpath選擇器,結(jié)果都是相同的。 
結(jié)果如下:

常用的查找元素方法:

  • find_element_by_name:通過元素name定位
  • find_element_by_id:通過元素id定位
  • find_element_by_xpath:通過xpath表達(dá)式定位
  • find_element_by_link_text:通過完整超鏈接文本定位
  • find_element_by_partial_link_text:通過部分鏈接文本定位
  • find_element_by_tag_name:通過標(biāo)簽定位
  • find_element_by_class_name:通過類名進(jìn)行定位
  • find_element_by_css_selector:通過css選擇器進(jìn)行定位

舉例:

通過xpath定位,xpath定位有N種寫法,這里列幾個(gè)常用寫法:

dr.find_element_by_xpath("http://*[@id='kw']")
dr.find_element_by_xpath("http://*[@name='wd']")
dr.find_element_by_xpath("http://input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("http://span[@class='soutu-btn']/input")
dr.find_element_by_xpath("http://form[@id='form']/span/input")
dr.find_element_by_xpath("http://input[@id='kw' and @name='wd']")

通過css定位,css定位有N種寫法,這里列幾個(gè)常用寫法:

dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")

xpath的使用方法

1. 第一種方法:通過絕對(duì)路徑做定位(相信大家不會(huì)使用這種方式)

By.xpath(“html/body/div/form/input”)

2. 第二種方法:通過相對(duì)路徑做定位,兩個(gè)斜杠代表相對(duì)路徑

By.xpath(“//input//div”)

3. 第三種方法:通過元素索引定位

By.xpath(“//input[4]”)

4. 第四種方法:使用xpath+節(jié)點(diǎn)屬性定位(結(jié)合第2、第3中方法可以使用)

By.xpath(“//input[@id='kw1']”)
By.xpath(“//input[@type='name' and @name='kw1']”)

5. 第五種方法:使用部分屬性值匹配(最強(qiáng)大的方法)

By.xpath(“//input[start-with(@id,'nice')]”)
By.xpath(“//input[ends-with(@id,'很漂亮')]”)
By.xpath(“//input[contains(@id,'那么美')]”)

6. 第六種方法:使用前集中方法的組合

By.xpath(“//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

下面這種方式是比較通用的一種方式:這里需要記住By模塊所以需要導(dǎo)入。

from selenium import webdriver

from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get("http://www.taobao.com")
input_first = browser.find_element(By.ID,"q")
print(input_first)
browser.close()

當(dāng)然這種方法和上述的方式是通用的,browser.find_element(By.ID,"q")這里By.ID中的ID可以替換為其他幾個(gè)

2、多個(gè)元素查找

多個(gè)元素find_elements,單個(gè)元素是find_element,其他使用上沒什么區(qū)別,通過其中的一個(gè)例子演示:

browser.get(<a  rel="external nofollow"  rel="external nofollow"   target="_blank">http://www.taobao.com</a>)
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()

這樣獲得就是一個(gè)列表

當(dāng)然上面的方式也是可以通過導(dǎo)入from selenium.webdriver.common.by import By 這種方式實(shí)現(xiàn)

lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')

同樣的在單個(gè)元素中查找的方法在多個(gè)元素查找中同樣存在:

  • find_elements_by_name
  • find_elements_by_id
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

4、元素交互操作

一般來說,webdriver 中比較常用的操作對(duì)象的方法有下面幾個(gè):

  • click——點(diǎn)擊對(duì)象
  • send_keys——在對(duì)象上模擬按鍵輸入
  • clear——清除對(duì)象的內(nèi)容,如果可以的話
  • submit——提交對(duì)象的內(nèi)容,如果可以的話
  • text——用于獲取元素的文本信息

1、鍵盤事件

要想調(diào)用鍵盤按鍵操作需要引入 keys 包:

from selenium.webdriver.common.keys import Keys

通過 send_keys()調(diào)用按鍵:

send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回車
send_keys(Keys.CONTROL,'a') # ctrl+a 全選輸入框內(nèi)容 
send_keys(Keys.CONTROL,'x') # ctrl+x 剪切輸入框內(nèi)容
import time

browser.get(http://www.taobao.com)
input_str = browser.find_element_by_id('q')
input_str.send_keys("ipad")
time.sleep(1)
input_str.clear()
input_str.send_keys("MakBook pro")
button = browser.find_element_by_class_name('btn-search')
button.click()

運(yùn)行的結(jié)果可以看出程序會(huì)自動(dòng)打開Chrome瀏覽器并打開淘寶輸入ipad,然后刪除,重新輸入MakBook pro,并點(diǎn)擊搜索。

2、鼠標(biāo)事件

鼠標(biāo)事件一般包括鼠標(biāo)右鍵、雙擊、拖動(dòng)、移動(dòng)鼠標(biāo)到某個(gè)元素上等等。需要引入ActionChains類。引入方法:

from selenium.webdriver.common.action_chains import ActionChains

ActionChains 常用方法:

  • context_click() :右擊;
  • double_click() :雙擊;
  • drag_and_drop(): 拖動(dòng);
  • move_to_element() :鼠標(biāo)懸停。
  • perform(): 執(zhí)行所有ActionChains 中存儲(chǔ)的行為;

鼠標(biāo)雙擊示例:

qqq =driver.find_element_by_xpath("xxx")  #定位到要雙擊的元素
ActionChains(driver).double_click(qqq).perform() #對(duì)定位到的元素執(zhí)行鼠標(biāo)雙擊操作

鼠標(biāo)拖放示例:

from selenium.webdriver import ActionChains

url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()

更多操作參考:

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

5、執(zhí)行JavaScript

這是一個(gè)非常有用的方法,這里就可以直接調(diào)用js方法來實(shí)現(xiàn)一些操作,下面的例子是通過登錄知乎然后通過js翻到頁面底部,并彈框提示

browser.get(<a  rel="external nofollow"   target="_blank">http://www.zhihu.com/explore</a>)
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

6、獲取DOM

1、獲取元素屬性:get_attribute('class')

url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))

2、獲取文本值:text

url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

3、獲取ID,位置,標(biāo)簽名

  • id
  • location
  • tag_name
  • size
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

7、Frame

在很多網(wǎng)頁中都是有Frame標(biāo)簽,所以我們爬取數(shù)據(jù)的時(shí)候就涉及到切入到frame中以及切出來的問題,通過下面的例子演示

這里常用的是switch_to.from()和switch_to.parent_frame()

import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
print(source)

try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

8、等待

1、隱式等待

當(dāng)使用了隱式等待執(zhí)行測試的時(shí)候,如果 WebDriver沒有在 DOM中找到元素,將繼續(xù)等待,超出設(shè)定時(shí)間后則拋出找不到元素的異常。

換句話說,當(dāng)查找元素或元素并沒有立即出現(xiàn)的時(shí)候,隱式等待將等待一段時(shí)間再查找 DOM,默認(rèn)的時(shí)間是0

到了一定的時(shí)間發(fā)現(xiàn)元素還沒有加載,則繼續(xù)等待我們指定的時(shí)間,如果超過了我們指定的時(shí)間還沒有加載就會(huì)拋出異常,如果沒有需要等待的時(shí)候就已經(jīng)加載完畢就會(huì)立即執(zhí)行

browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

2、顯示等待

指定一個(gè)等待條件,并且指定一個(gè)最長等待時(shí)間,會(huì)在這個(gè)時(shí)間內(nèi)進(jìn)行判斷是否滿足等待條件。

如果成立就會(huì)立即返回,如果不成立,就會(huì)一直等待,直到等待你指定的最長等待時(shí)間,如果還是不滿足,就會(huì)拋出異常,如果滿足了就會(huì)正常返回。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

上述的例子中的條件:EC.presence_of_element_located()是確認(rèn)元素是否已經(jīng)出現(xiàn)了。EC.element_to_be_clickable()是確認(rèn)元素是否是可點(diǎn)擊的

3、常用的判斷條件:

  • title_is :標(biāo)題是某內(nèi)容
  • title_contains :標(biāo)題包含某內(nèi)容
  • presence_of_element_located :元素加載出,傳入定位元組,如(By.ID, 'p')
  • visibility_of_element_located :元素可見,傳入定位元組
  • visibility_of :可見,傳入元素對(duì)象
  • presence_of_all_elements_located :所有元素加載出
  • text_to_be_present_in_element :某個(gè)元素文本包含某文字
  • text_to_be_present_in_element_value :某個(gè)元素值包含某文字
  • frame_to_be_available_and_switch_to_it :frame加載并切換
  • invisibility_of_element_located :元素不可見
  • element_to_be_clickable :元素可點(diǎn)擊
  • staleness_of :判斷一個(gè)元素是否仍在DOM,可判斷頁面是否已經(jīng)刷新
  • element_to_be_selected :元素可選擇,傳元素對(duì)象
  • element_located_to_be_selected :元素可選擇,傳入定位元組
  • element_selection_state_to_be :傳入元素對(duì)象以及狀態(tài),相等返回True,否則返回False
  • element_located_selection_state_to_be :傳入定位元組以及狀態(tài),相等返回True,否則返回False
  • alert_is_present :是否出現(xiàn)Alert

實(shí)例:博客園標(biāo)題判斷

# coding: utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.cnblogs.com/101718qiong/")

title = EC.title_is(u"Silence&QH - 博客園") # 判斷title完全等于
print title(driver)
 
title1 = EC.title_contains("Silence&QH") # 判斷title包含
print title1(driver)

r1 = EC.title_is(u"Silence&QH - 博客園")(driver) # 另外寫法
r2 = EC.title_contains("Silence&QH")(driver)
print r1
print r2

更多操作參考:

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

9、瀏覽器瀏覽器操作

瀏覽器最大化、最小化

browser.maximize_window() # 將瀏覽器最大化顯示
browser.minimize_window() # 將瀏覽器最小化顯示

瀏覽器設(shè)置窗口大小

browser.set_window_size(480, 800) # 設(shè)置瀏覽器寬480、高800顯示

瀏覽器前進(jìn)后退

  • back() :后退
  • forward():前進(jìn)
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

10、cookie操作

  • get_cookies()
  • delete_all_cookes()
  • add_cookie()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

11、多窗口管理

通過執(zhí)行js命令實(shí)現(xiàn)新開選項(xiàng)卡window.open(),不同的選項(xiàng)卡是存在列表里browser.window_handles。

通過browser.window_handles[0]就可以操作第一個(gè)選項(xiàng)卡,current_window_handle:獲得當(dāng)前窗口句柄

import time

browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
browser.get('https://python.org')

12、異常處理

這里的異常比較復(fù)雜,官網(wǎng)的參考地址:

http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions

這里只進(jìn)行簡單的演示,查找一個(gè)不存在的元素

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()

13.警告框處理

在WebDriver中處理JavaScript所生成的alert、confirm以及prompt十分簡單,具體做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法進(jìn)行操作。

方法

  • text : 返回 alert/confirm/prompt 中的文字信息
  • accept() : 接受現(xiàn)有警告框
  • dismiss() : 解散現(xiàn)有警告框
  • send_keys(keysToSend) : 發(fā)送文本至警告框。keysToSend:將文本發(fā)送至警告框。

實(shí)例演示

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')

# 鼠標(biāo)懸停至“設(shè)置”鏈接
link = driver.find_element_by_link_text('設(shè)置')
ActionChains(driver).move_to_element(link).perform()

# 打開搜索設(shè)置
driver.find_element_by_link_text("搜索設(shè)置").click()

#在此處設(shè)置等待2s否則可能報(bào)錯(cuò)
time.sleep(2)
 # 保存設(shè)置
driver.find_element_by_class_name("prefpanelgo").click()
 time.sleep(2)

# 接受警告框
driver.switch_to.alert.accept()

driver.quit()

14、下拉框選擇操作

導(dǎo)入選擇下拉框Select類,使用該類處理下拉框操作。

from selenium.webdriver.support.select import Select

Select類的方法:

  • select_by_value(“選擇值”) select標(biāo)簽的value屬性的值
  • select_by_index(“索引值”) 下拉框的索引
  • select_by_visible_testx(“文本值”) 下拉框的文本值

有時(shí)我們會(huì)碰到下拉框,WebDriver提供了Select類來處理下拉框。 如百度搜索設(shè)置的下拉框。

from selenium import webdriver
 from selenium.webdriver.support.select import Select
 from time import sleep

driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
 driver.implicitly_wait(10)
 driver.get('http://www.baidu.com')

#1.鼠標(biāo)懸停至“設(shè)置”鏈接
driver.find_element_by_link_text('設(shè)置').click()
 sleep(1)
 #2.打開搜索設(shè)置
driver.find_element_by_link_text("搜索設(shè)置").click()
 sleep(2)

#3.搜索結(jié)果顯示條數(shù)
sel = driver.find_element_by_xpath("http://select[@id='nr']")
 Select(sel).select_by_value('50')  # 顯示50條

sleep(3)
 driver.quit()

15、文件上傳

對(duì)于通過input標(biāo)簽實(shí)現(xiàn)的上傳功能,可以將其看作是一個(gè)輸入框,即通過send_keys()指定本地文件路徑的方式實(shí)現(xiàn)文件上傳。

通過send_keys()方法來實(shí)現(xiàn)文件上傳:

from selenium import webdriver
import os

driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)

# 定位上傳按鈕,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')

driver.quit()

16、窗口截圖

自動(dòng)化用例是由程序去執(zhí)行的,因此有時(shí)候打印的錯(cuò)誤信息并不十分明確。如果在腳本執(zhí)行出錯(cuò)的時(shí)候能對(duì)當(dāng)前窗口截圖保存,那么通過圖片就可以非常直觀地看出出錯(cuò)的原因。WebDriver提供了截圖函數(shù)get_screenshot_as_file()來截取當(dāng)前窗口。

截屏方法:

get_screenshot_as_file(self, filename) 用于截取當(dāng)前窗口,并把圖片保存到本地

from selenium import webdriver
from time import sleep

driver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get('http://www.baidu.com')

driver.find_element_by_id('kw').send_keys('selenium')
 driver.find_element_by_id('su').click()
 sleep(2)

#1.截取當(dāng)前窗口,并指定截圖圖片的保存位置
driver.get_screenshot_as_file("D:\\baidu_img.jpg")

driver.quit()

17、關(guān)閉瀏覽器

在前面的例子中我們一直使用quit()方法,其含義為退出相關(guān)的驅(qū)動(dòng)程序和關(guān)閉所有窗口。除此之外,WebDriver還提供了close()方法,用來關(guān)閉當(dāng)前窗口。例多窗口的處理,在用例執(zhí)行的過程中打開了多個(gè)窗口,我們想要關(guān)閉其中的某個(gè)窗口,這時(shí)就要用到close()方法進(jìn)行關(guān)閉了。

  • close() 關(guān)閉單個(gè)窗口
  • quit() 關(guān)閉所有窗口

18、selenium規(guī)避被檢測識(shí)別

現(xiàn)在不少大網(wǎng)站有對(duì)selenium采取了監(jiān)測機(jī)制。比如正常情況下我們用瀏覽器訪問淘寶等網(wǎng)站的 window.navigator.webdriver的值為 
undefined。而使用selenium訪問則該值為true。那么如何解決這個(gè)問題呢?

只需要設(shè)置Chromedriver的啟動(dòng)參數(shù)即可解決問題。在啟動(dòng)Chromedriver之前,為Chrome開啟實(shí)驗(yàn)性功能參數(shù)excludeSwitches,它的值為['enable-automation'],完整代碼如下:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

19、實(shí)例:

自動(dòng)登陸CSDN

import time
import numpy as np
from numpy import random
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def ease_out_expo(x):
    if x == 1:
        return 1
    else:
        return 1 - pow(2, -10 * x)


def get_tracks(distance, seconds, ease_func):
    tracks = [0]
    offsets = [0]
    for t in np.arange(0.0, seconds+0.1, 0.1):
        ease = globals()[ease_func]
        offset = round(ease(t / seconds) * distance)
        tracks.append(offset - offsets[-1])
        offsets.append(offset)
    return offsets, tracks


def drag_and_drop(browser, offset):
    # 定位滑塊元素
    WebDriverWait(browser, 20).until(
        EC.visibility_of_element_located((By.XPATH, "http://*[@class='nc_iconfont btn_slide']"))
    )
    knob = browser.find_element_by_xpath("http://*[@class='nc_iconfont btn_slide']")
    offsets, tracks = get_tracks(offset, 0.2, 'ease_out_expo')
    ActionChains(browser).click_and_hold(knob).perform()
    for x in tracks:
        ActionChains(browser).move_by_offset(x, 0).perform()
    # 放開
    ActionChains(browser).pause(random.randint(6, 14) / 10).release().perform()


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--start-maximized")
browser = webdriver.Chrome(chrome_options=chrome_options)

browser.get('http://www.baidu.com')
browser.find_element_by_id('kw').send_keys('CSDN')
browser.find_element_by_id('su').click()
WebDriverWait(browser, 20).until(
    EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, "-專業(yè)IT技術(shù)社區(qū)"))
)

browser.find_element_by_partial_link_text('-專業(yè)IT技術(shù)社區(qū)').click()

browser.switch_to.window(browser.window_handles[1])  # 移動(dòng)句柄
time.sleep(1)
browser.find_element_by_partial_link_text('登錄').click()
browser.find_element_by_link_text('賬號(hào)密碼登錄').click()
browser.find_element_by_id('all').send_keys('yangbobin')
browser.find_element_by_name('pwd').send_keys('pass-word')
browser.find_element_by_css_selector("button[data-type='account']").click()
time.sleep(5)  # 等待滑動(dòng)模塊和其他JS文件加載完畢!
while True:
    # 定義鼠標(biāo)拖放動(dòng)作
    drag_and_drop(browser, 261)
    # 等待JS認(rèn)證運(yùn)行,如果不等待容易報(bào)錯(cuò)
    time.sleep(2)
    # 查看是否認(rèn)證成功,獲取text值
    WebDriverWait(browser, 20).until(
        EC.visibility_of_element_located((By.LINK_TEXT, "刷新"))
    )
    browser.find_element_by_link_text('刷新').click()

自動(dòng)登陸163郵箱

首先,是163.的登陸為iframe

browser.switch_to_frame('x-URS-iframe')

到此這篇關(guān)于python爬蟲之selenium模塊的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論