1. 程式人生 > >python 中的selenium模組使用方法

python 中的selenium模組使用方法

1. 簡介
selenium 最初是一個自動化測試工具,因為requests無法直接執行js程式碼,所以在爬蟲中使用它.
selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉 輸入 點選 後退 前進等, 直接那到網頁渲染後的結果,可以支援多種瀏覽器.

```
from selenium import webdriver
browser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()
browser=webdriver.Edge()
```
 官網:http://selenium-python.readthedocs.io

2. 安裝
使用pip 安裝 selenium

pip3 install selenium

驗證安裝,進入cmd 呼叫Python

from selenium import webdriver
driver = webdriver.Chrome()#彈出瀏覽器
driver.get('https://www.baidu.com') #訪問百度

3. 基本使用

from selenium import webdriver #驅動瀏覽器
from selenium.webdriver import ActionChains #滑動驗證
from selenium.webdriver.common.by
import By #選擇器 from selenium.webdriver.common.keys import Keys #模擬鍵盤的按鍵 from selenium.webdriver.support import expected_conditions as EC # from selenium.webdriver.support.wait import WebDriverWait #與EC聯用,等待某個元素被載入 import time browser = webdriver.Chrome() wait = WebDriverWait(browser, 10)#最長等待載入時間 browser.get
('https://www.baidu.com') input_tag = browser.find_element_by_id('kw') #找到id為kw的標籤 input_tag.send_keys('蘋果切一半') button = browser.find_element_by_id('su') button.click()#點選 wait.until(EC.presence_of_element_located((By.ID, 'content_left')))#等待id為content_left載入完 res = browser.page_source#獲取結果 print(res) time.sleep(10) browser.close()#關閉瀏覽器

4. 三種選擇器
三種查詢元素方式

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素

browser=webdriver.Chrome()

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

#以下三種方式達到的都是同一種效果:查詢id為kw的標籤
input_tag1=browser.find_element(By.ID,'kw') #等同於:input_tag1=browser.find_element_by_id('kw')

input_tag2=browser.find_element(By.CSS_SELECTOR,'#kw') #等同於:input_tag2=browser.find_element_by_css_selector('#kw')

input_tag3=browser.find_element(By.XPATH,'//*[@id="kw"]') #等同於:input_tag3=browser.find_element_by_xpath('//*[@id="kw"]')

#注意:browser.find_elements系列與browser.find_element的區別就是,前者是查詢多個,後者是隻找第一個
div1=browser.find_element(By.CSS_SELECTOR,'div') #找到第一個div標籤
div2=browser.find_elements(By.CSS_SELECTOR,'div') #找到所有的div標籤,放到列表裡

browser.close()

三種查詢元素方式
獲取標籤屬性
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素

browser=webdriver.Chrome()

browser.get('https://www.amazon.cn/')

wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'cc-lm-tcgShowImgContainer')))

tag=browser.find_element(By.CSS_SELECTOR,'#cc-lm-tcgShowImgContainer img')

#獲取標籤屬性,
print(tag.get_attribute('src'))


#獲取標籤ID,位置,名稱,大小(瞭解)
print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)


browser.close()

獲取標籤屬性

5. 等待元素被載入
1、selenium只是模擬瀏覽器的行為,而瀏覽器解析頁面是需要時間的(執行css,js),一些元素可能需要過一段時間才能加載出來,為了保證能查詢到元素,必須等待

2、等待的方式分兩種:
隱式等待:在browser.get(’xxx’)前就設定,針對所有元素有效

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素

browser=webdriver.Chrome()

#隱式等待:在查詢所有元素時,如果尚未被載入,則等10秒
browser.implicitly_wait(10)

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


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

contents=browser.find_element_by_id('content_left') #沒有等待環節而直接查詢,找不到則會報錯
print(contents)

browser.close()

隱式等待

顯式等待:在browser.get(’xxx’)之後設定,只針對某個元素有效

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)


#顯式等待:顯式地等待某個元素被載入
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))

contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
print(contents)


browser.close()

顯式等待

6. 元素互動操作
點選清空

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素

browser=webdriver.Chrome()
browser.get('https://www.amazon.cn/')
wait=WebDriverWait(browser,10)


input_tag=wait.until(EC.presence_of_element_located((By.ID,'twotabsearchtextbox')))
input_tag.send_keys('iphone 8')
button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
button.click()


import time
time.sleep(3)

input_tag=browser.find_element_by_id('twotabsearchtextbox')
input_tag.clear() #清空輸入框
input_tag.send_keys('iphone7plus')
button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
button.click()



# browser.close()

點選,清空

actions.perform

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

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素


browser=webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult') #切換到iframeResult

source=browser.find_element_by_id('draggable')
target=browser.find_element_by_id('droppable')

actions=ActionChains(browser) #拿到動作鏈物件
actions.drag_and_drop(source,target) #把動作放到動作鏈中,準備序列執行
actions.perform() #執行

Action Chains

一些難以實現的操作,自己寫js程式碼

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入某些元素


try:
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('alert("hello world")') #列印警告
finally:
    browser.close()

在互動動作比較難實現的時候可以自己寫JS(萬能方法)

7. 補充

模擬瀏覽器的前進後退

#模擬瀏覽器的前進後退
import time
from selenium import webdriver

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('http://www.sina.com.cn/')

browser.back()
time.sleep(10)
browser.forward()
browser.close()

模擬瀏覽器的前進後退

cookies

#cookies
from selenium import webdriver

browser=webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'k1':'xxx','k2':'yyy'})
print(browser.get_cookies())

# browser.delete_all_cookies()

cookies

異常處理

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

try:
    browser=webdriver.Chrome()
    browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    browser.switch_to.frame('iframssseResult')

except TimeoutException as e:
    print(e)
except NoSuchFrameException as e:
    print(e)
finally:
    browser.close()

異常處理

8. 自動登入126郵箱併發送郵件

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "half apple"
# Date: 2017/11/8

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By  # 按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait  # 等待頁面載入某些元素
import time
driver=webdriver.Chrome()
wait = WebDriverWait(driver, 5)
try:
    driver.get('http://mail.126.com/')
    frame = wait.until(EC.presence_of_element_located((By.ID, 'x-URS-iframe')))
    driver.switch_to.frame(frame)
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'm-container')))
    inp_user = driver.find_element_by_name('email')
    inp_pwd = driver.find_element_by_name('password')
    button = driver.find_element_by_id('dologin')
    inp_user.send_keys('郵箱賬號')
    inp_pwd.send_keys('郵箱密碼')
    button.click()
    wait.until(EC.presence_of_element_located((By.ID, 'dvNavTop')))
    write_msg = driver.find_elements_by_css_selector('#dvNavTop li')[1]  # 獲取第二個li標籤就是“寫信”了
    write_msg.click()
    wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tH0')))
    recv_man=driver.find_element_by_class_name('nui-editableAddr-ipt')
    title=driver.find_element_by_css_selector('.dG0 .nui-ipt-input')
    recv_man.send_keys('[email protected]')
    title.send_keys('FBI WARNING')
    print(title.tag_name)


    frame=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'APP-editor-iframe')))
    driver.switch_to.frame(frame)
    body=driver.find_element(By.CSS_SELECTOR, 'body')
    body.send_keys('Federal law provides severe civil  and criminal penalties for the unauthorized reproduction,distribution,or exhibition of copyrighted motion prictures(Title 17, United States Code, Sections 501 and 508). The federal bureau of Investigation investigate allegations of criminal copyright infringement.')



    # pic_btn = driver.find_elements_by_css_selector('.ico-editor-image')[0].parent
    # print(pic_btn)
    # pic_btn.click()
    #
    # frame = wait.until(EC.presence_of_element_located((By.ID, '_mail_msgbox_4_709')))
    # driver.switch_to.frame(frame)
    # wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nui-msgbox-normal ')))
    # url_btn = driver.find_element_by_class_name('nui-tabs-item-hover')
    # url_btn.click()
    # url_ipt = driver.find_elements_by_css_selector('#_mail_input_7_719 input')
    # url_ipt.send_keys('https://gss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/4a36acaf2edda3ccc38e3b2f02e93901213f9253.jpg')
    # url_tak = driver.find_element_by_css_selector('#_mail_button_140_720 span')
    # url_tak.click()
    # driver.switch_to.parent_frame()
    driver.switch_to.parent_frame() #切回他爹
    send_button=driver.find_element_by_class_name('nui-toolbar-item')
    send_button.click()

    #可以睡時間久一點別讓瀏覽器關掉,看看傳送成功沒有
    import time
    time.sleep(10000)
except Exception as e:
    print('1111111111111')
    print(e)
finally:
    driver.close()

相關推薦

Pythonrandom模組方法介紹

random模組: Python標準庫中的random函式,可以生成隨機浮點數、整數、字串,甚至幫助你隨機選擇列表序列中的一個元素,打亂一組資料等。 random模組中的重要方法: random.random(): random.random()方法返回一個隨機數,隨

Pythonos模組實用的檔案和目錄操作方法Python內建變數

Python常用檔案和目錄操作函式   序號 方法及描述 1 os.access(path, mode) 檢驗許可權模式 2 os.chdir(path) 改變當前工作目

pythondatetime模組datetime物件的使用方法

本文只講述datetime模組中datetime物件的一些常用的方法,如果讀者需要更多datetime模組的資訊,請查閱此文件。 datetime模組的物件有如下: timedelta date datetime time tzinfo 還包含以下兩個

pythonselenium操作下拉滾動條方法彙總

UI自動化中經常會遇到元素識別不到,找不到的問題,原因有很多,比如不在iframe裡,xpath或id寫錯了等等;但有一種是在當前顯示的頁面元素不可見,拖動下拉條後元素就出來了。 在python中有幾種方法解決這種問題,簡單介紹下,給需要的人: 方法一)使用

pythoncx_Oracle模組安裝遇到的問題與解決方法

     安裝或使用cx_Oracle時,需要用到Oracel的連結庫,如libclntsh.so.10.1,否則會有各種各樣的錯誤資訊。      安裝Oracle Instant Client就可得到這個連結庫,避免安裝幾百兆之巨的Oracle Client。 軟體下載

Pythonnumpy模組的tile()方法簡單說明

函式形式: tile(A,rep) 功能:重複A的各個維度 引數型別: - A: Array類的都可以 - rep:A沿著各個維度重複的次數 舉例: tile([1,2],2) 輸出[1,2,1,2] tile([1,2],(2,2))

pythonOS常用方法

posix one 獲得 常用 chdir mac 絕對路徑 itext 文件大小 Python的標準庫中的os模塊包含普遍的操作系統功能。如果你希望你的程序能夠與平臺無關的話,這個模塊是尤為重要的。即它允許一個程序在編寫後不需要任何改動,也不會發生任何問題,就可以在Lin

Python的魔術方法

ans normal pla -i port ont 語法 整數 text 魔術方法就是一個類/對象中的方法,和普通方法唯一的不同時,普通方法需要調用!而魔術方法是在特定時刻自動觸發。 這裏列舉出幾個常用的魔術方法: 1.__init__ 初始化魔術方法 觸發時機:初始化對

python類的方法裏面變量前加self與不加self的區別

UI PYTHON SELF 1.最近在執行一個UI自動化腳本登錄網站時遇到一個很奇葩的問題:運行腳本後chromedriver會驅動瀏覽器打開網站執行腳本裏面的一系列界面操作,操作完後瀏覽器自動關閉了(重點就在這裏,我明明沒有調用webdriver的close()或是quite()方法,為什麽它

python的reload方法

code pytho 方法 style 用法 rom 內置函數 python bsp 在python2中,reload()是內置函數,能夠直接使用。 但是在python3中,直接使用reload()會報錯,需要從imp中導入。 用法為 >>>from

python 的__item__方法

elf ict attr_ ttr nbsp get alex IV pan class Foo: def __init__(self,name): self.name=name def __getitem__(self, item):

Python的__new__()方法的使用

修改 index data- 常熟 response 產生 parse weakref nts __new__() 函數只能用於從object繼承的新式類。 先看下object類中對__new__()方法的定義: class object: @s

python的類方法、靜態方法、對象方法

pre sin 不能 ron require 修飾 所有 method 進行 註:以下都是以公有為前提,私有方法只能在類內部調用,不需多講。 1、對象方法 這種方法都有一個默認參數:self 這代表實例的這個對象 def __init__(self):

pythonmultiprocessing模組之Pipe管道

原文地址,本文在原文基礎上添加了部分註釋。 multiprocessing.Pipe([duplex]) 方法返回2個連線物件(conn1, conn2),代表管道的兩端,預設duplex為True,是雙向通訊。如果duplex為False,則conn1只能用來接收訊息,conn2只能用來

pythonos模組的作用

簡介 OS模組簡單的來說它是一個Python的系統程式設計的操作模組,可以處理檔案和目錄這些我們日常手動需要做的操作。如果你希望你的程式能夠與平臺無關的話,這個模組是尤為重要的。 常用函式和變數 os.sep可以取代作業系統特定的路徑分隔符。windows下為 “\” os.

Python的類方法和靜態方法

作者:黎智煊 ,叩丁狼高階講師。本文為原創文章,轉載請註明出處。     類方法 是類物件所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對於類方法,第一個引數必須是類物件,一般以cls作為第一個引數(當然可以用其他名稱的變數作

PythonMatplotlib模組的簡單使用

目錄 Matplotlib pyplot類 pyplot.plot() 配置屬性 pyplot.subplot() Matplotlib Matplotlib 是 Python 2D 繪圖領域使用最廣泛的套件。它能讓使用者很輕鬆地將資料圖形化,並且提供多樣化的輸出格式

PythonNumpy模組的使用

目錄 NumPy ndarray物件 Numpy資料型別 Numpy陣列屬性 NumPy NumPy(Numerical Python) 是 Python 的一個擴充套件程式庫,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。Nupmy可用來儲存和處

Python Wxpy模組以及其監控

概述:   本文主要分享一下博主在學習wxpy 的過程中開發的一個小程式。博主在最近有一個監控報警的需求需要完成,然後剛好在學習wxpy 這個東西,因此很巧妙的將工作和學習聯絡在一起。   博文中主要使用到的技術設計到Python,Redis,以及Java。涉及到的技術看

Pythonlogging模組

1、日誌級別 日誌級別 數值 Critical 50 Error 40 Warning 30 Info 20