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 不常見,好像是在某些情況下驅動啟動瀏覽器失敗的時候會報這個錯