自動點擊網頁腳本---selenium庫使用


selenium操作各種瀏覽器
下載瀏覽器對應版本的chromedriver.exe放到 %systemroot%目錄或其它可以被系統環境找到的目錄下
#coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
#配置360瀏覽器地址開始
__browser_url = r'D:\Program Files\360Chrome\Chrome\Application\360chrome.exe' #瀏覽器目錄地址
chrome_driver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe" 
chrome_options = Options()
chrome_options.binary_location = __browser_url
#配置360瀏覽器地址結束
brower = webdriver.Chrome(chrome_driver,options=chrome_options)
#brower = webdriver.Firefox()
#brower = webdriver.IE()
brower.find_elements_by_......

 

瀏覽器啟用方式
啟動Chrome瀏覽器:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.lidihuo.com/')
 
啟動Firefox瀏覽器:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://www.lidihuo.com/')
 
啟動IE瀏覽器:
from selenium import webdriver
browser = webdriver.Ie()
browser.get('https://www.lidihuo.com/')
添加瀏覽器參數add_argument
chrome_options.add_argument('--參數1 --參數2')
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) #不輸出console.log的日志內容到控制台
chrome_options.add_argument('--start-maximized') # 最大化運行(全屏窗口),不設置,取元素會報錯
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) #規避部分網站對selenium的檢測
browser = webdriver.Chrome(options=chrome_options) #加載參數
 
具體可參見 https://peter.sh/experiments/chromium-command-line-switches/ ,該網站羅列了所有的參數。
設置代理
chrome_options.add_argument('--proxy-server=http://{ip}:{port}')
Headless方式啟動
Headless Chrome 是 Chrome 瀏覽器的無界面形態,可以在不打開瀏覽器的前提下,使用所有 Chrome 支持的特性運行你的程序。相比於現代瀏覽器,Headless Chrome 更加方便測試 web 應用,獲得網站的截圖,做爬蟲抓取信息等。相比於較早的 PhantomJS,SlimerJS 等,Headless Chrome 則更加貼近瀏覽器環境。
Headless Chrome 對Chrome版本要求:
官方文檔中介紹,mac和linux環境要求chrome版本是59+,而windows版本的chrome要求是60+,同時chromedriver要求2.30+版本。
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 使用headless無界面瀏覽器模式
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 啟動瀏覽器,獲取網頁源代碼
browser = webdriver.Chrome(options=chrome_options)

 

加載配置啟動瀏覽器
Selenium操作瀏覽器是不加載任何配置的,下面是關於加載Chrome配置的方法:
用Chrome地址欄輸入chrome://version/,查看自己的“個人資料路徑”,然后在瀏覽器啟動時,調用這個配置文件,代碼如下:
# coding=utf-8
from selenium import webdriver
option = webdriver.ChromeOptions()
# 設置成用戶自己的數據目錄
option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data')
driver=webdriver.Chrome(options=option)
 
單獨配置瀏覽器selenium驅動位置
chrome_driver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
 
而加載Firefox配置的方法有些不同:
打開Firefox點右上角設置>?(幫助)>故障排除信息>顯示文件夾,打開后把路徑復制下來就可以了
# coding=utf-8
from selenium import webdriver
# 配置文件地址
profile_directory = r'C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
# 加載配置配置
profile = webdriver.FirefoxProfile(profile_directory)
# 啟動瀏覽器配置
driver = webdriver.Firefox(profile)

 

 
使用selenium控制已打開的瀏覽器
這里給出Google Chrome瀏覽器的解決方案。
我們可以利用Chrome DevTools協議。它允許客戶檢查和調試Chrome瀏覽器。
打開cmd,在命令行中輸入命令:
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"
  • 對於-remote-debugging-port值,可以指定任何打開的端口。
  • 對於-user-data-dir標記,指定創建新Chrome配置文件的目錄。它是為了確保在單獨的配置文件中啟動chrome,不會污染你的默認配置文件。
還有,不要忘了在環境變量中PATH里將chrome的路徑添加進去。
此時會打開一個瀏覽器頁面,我們輸入百度網址,我們把它當成一個已存在的瀏覽器:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
 
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_driver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
print(driver.title)

 

會發現打印出了 “百度一下,你就知道” 的網頁標題。這樣我們就實現了對一個已打開的瀏覽器的控制。
webdriver.chrome()
  • 其它
    • execute_script('js代碼')
      • 需要先新建js代碼,再執行
        • js='scrollTo(0,1000)' js滾動代碼
    • switch_to_alert()
    • quit() 退出瀏覽器
  • 元素定位
    • 查找一個元素
      • find_element_by_id()
      • find_element_by_name()
      • find_element_by_link_text() 匹配全部文本
      • find_element_by_partial_link_text() 部分文本匹配
      • find_element_by_xpath()
      • find_element_by_class_name() 單類名用
      • find_element_by_tag_name()
      • find_element_by_css_selector() css通用
    • 查找一組元素
      • find_elements_by_id()
      • find_elements_by_name()
      • find_elements_by_link_text()
      • find_elements_by_partial_link_text()
      • find_elements_by_xpath()
      • find_elements_by_class_name()
      • find_elements_by_tag_name()
      • find_elements_by_css_selector()
        • class含有空格時解決方法
          • 直接包含空格的CSS屬性定位大法
            • find_element_by_css_selector("[class='classname1 classname2']").send_keys("yoyo")
          • 或者在每個class前面加上點
            • find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()
  • 元素操作方法
    • send_keys() 發送文本或按鍵
      • 發送回車鍵
        • 要想調用鍵盤按鍵操作需要引入 keys 包:
        • from selenium.webdriver.common.keys import Keys
        • 通過 send_keys()調用按鍵:
          • send_keys(Keys.ENTER)
        • 鍵盤組合鍵的用法:
          • # ctrl+a 全選輸入框內容
          • send_keys(Keys.CONTROL,'a')
      • 發送文本
        • send_keys("你好嗎")
    • click() 單擊
    • clear() 清除對象內容
    • submit() 提交
    • text() 獲取元素文本信息
  • 獲取元素屬性和文本
    • get_attribute()
      • innerHTML:會返回元素的內部 HTML, 包含所有的HTML標簽。
      • textContent:獲取 HTML 文本,需要注意的是 textContent 是 W3C 兼容的文字內容屬性,不支持 IE 瀏覽器。
      • innerText:獲取 HTML 文本,與 textContent 不同的是 innerText 不是 W3C DOM 的指定內容,不支持 FireFox 瀏覽器。
      • value:獲取帶有 value 屬性的值。
    • get_property()
  • 瀏覽器操作
    • 將瀏覽器最大化顯示
      • browser.maximize_window()
    • 將瀏覽器最小化顯示
      • browser.minimize_window()
    • 瀏覽器設置窗口大小
      • 設置瀏覽器寬480、高800顯示
        • browser.set_window_size(480, 800)
    • 瀏覽器前進后退
      • 前進
        • browser.forword()
      • 后退
        • browser.back()
  • 三種等待方式
    • 強制等待
      • time.sleep(秒)
        • 需要導入time包
    • 隱性等待
      • 通過添加 implicitly_wait() 方法就可以方便的實現智能等待;等待隱形等待是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然后執行下一步。
        • implicitly_wait(30) 智能等待30秒
      • 隱性等待對整個driver的周期都起作用,所以只要設置一次即可
    • 顯性等待
      • WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)
        • init
        • until
        • until_not
  • 多層框架定位
    • switch_to_frame
 
Xpath&Css定位方法速查表
  • 描述 Xpath Css
  • 直接子元素 //div/a div > a
  • 子元素或后代元素 //div//a div a
  • 以id定位 //div[@id='idValue']//a div#idValue a
  • 以class定位 //div[@class='classValue']//a div.classValue a
  • 同級弟弟元素 //ul/li[@class='first']/following- ul>li.first + li
  • 屬性 //form/input[@name='username'] form input[name='username']
  • 多個屬性 //input[@name='continue' and input[name='continue'][type='button
  • 第4個子元素 //ul[@id='list']/li[4] ul#list li:nth-child(4)
  • 第1個子元素 //ul[@id='list']/li[1] ul#list li:first-child
  • 最后1個子元素 //ul[@id='list']/li[last()] ul#list li:last-child
  • 屬性包含某字段 //div[contains(@title,'Title')] div[title*="Title"]
  • 屬性以某字段開頭 //input[starts-with(@name,'user')] input[name^="user"]
  • 屬性以某字段結尾 //input[ends-with(@name,'name')] input[name$="name"]
  • text中包含某字段 //div[contains(text(), 'text')] 無法定位
  • 元素有某屬性 //div[@title] div[title]
  • 父節點 //div/.. 無法定位
  • 同級哥哥節點 //li/preceding-sibling::div[1] 無法定位
 
Python Webdriver Exception速查表
webdriver在使用過程中可能會出現各種異常,我們需要了解該異常並知道如何進行異常處理。
  • 異常 描述
  • WebDriverException 所有webdriver異常的基類,當有異常且不屬於下列異常時拋出
  • InvalidSwitchToTargetException 下面兩個異常的父類,當要switch的目標不存在時拋出
  • NoSuchFrameException 當你想要用switch_to.frame()切入某個不存在的frame時拋出
  • NoSuchWindowException 當你想要用switch_to.window()切入某個不存在的window時拋出
  • NoSuchElementException 元素不存在,一般由find_element與find_elements拋出
  • NoSuchAttributeException 一般你獲取不存在的元素屬性時拋出,要注意有些屬性在不同瀏覽器里是有不同的屬性名的
  • StaleElementReferenceException 指定的元素過時了,不在現在的DOM樹里了,可能是被刪除了或者是頁面或iframe刷新了
  • UnexpectedAlertPresentException 出現了意料之外的alert,阻礙了指令的執行時拋出
  • NoAlertPresentException 你想要獲取alert,但實際沒有alert出現時拋出
  • InvalidElementStateException 下面兩個異常的父類,當元素狀態不能進行想要的操作時拋出
  • ElementNotVisibleException 元素存在,但是不可見,不可以與之交互
  • ElementNotSelectableException 當你想要選擇一個不可被選擇的元素時拋出
  • InvalidSelectorException 一般當你xpath語法錯誤的時候拋出這個錯
  • InvalidCookieDomainException 當你想要在非當前url的域里添加cookie時拋出
  • UnableToSetCookieException 當driver無法添加一個cookie時拋出
  • TimeoutException 當一個指令在足夠的時間內沒有完成時拋出
  • MoveTargetOutOfBoundsException actions的move操作時拋出,將目標移動出了window之外
  • UnexpectedTagNameException 獲取到的元素標簽不符合要求時拋出,比如實例化Select,你傳入了非select標簽的元素時
  • ImeNotAvailableException 輸入法不支持的時候拋出,這里兩個異常不常見,ime引擎據說是僅用於linux下對中文/日文支持的時候
  • ImeActivationFailedException 激活輸入法失敗時拋出
  • ErrorInResponseException 不常見,server端出錯時可能會拋
  • RemoteDriverServerException 不常見,好像是在某些情況下驅動啟動瀏覽器失敗的時候會報這個錯
 
 


免責聲明!

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



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