selenium

seleniumjavascript

 

selenium之ChromeDriver與版本下載 https://blog.csdn.net/u012991166/article/details/80490681
ChromeDriver下載地址: http://chromedriver.storage.googleapis.com/index.html
下載好後解壓出exe文件,放入環境變量保存的路徑下便可,即python文件夾下,或者python/script文件夾下便可

一次簡單的、完整的基本使用
from selenium import webdriver
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

browser = webdriver.Chrome()#返回一個瀏覽器驅動對象
try:
    browser.get('https://www.baidu.com') #訪問url
    input = browser.find_element_by_id('kw') # 返回id=kw的標籤
    input.send_keys('Python') # 往標籤裏傳入信息
    input.send_keys(Keys.ENTER)# 鍵入回車鍵
    wait = WebDriverWait(browser, 10)# 等待10秒
    wait.until(EC.presence_of_element_located((By.ID, 'content_left'))) #等待id= content_left 的內容加載完畢
    print(browser.current_url) #輸入browser的當前url
    print(browser.get_cookies()) # 輸出返回的cookies
    print(browser.page_source) # 打印源代碼
finally:
    browser.close()
selenium模塊安裝、簡單示例

 

聲明瀏覽器對象
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
聲明瀏覽器對象

 

獲取單個元素
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')   #查找並返回id=q的標籤
input_second = browser.find_element_by_css_selector('#q')#查找並返回id=q的標籤
input_third = browser.find_element_by_xpath('//*[@id="q"]')#查找並返回id=q的標籤

input_first = browser.find_element(By.ID, 'q')#另外一種,比較通用的查找方式

其餘相似的方法
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector


獲取多個元素
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')#方法的區別就是element多了個s;返回的是一個列表
lis = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')  # 天然也有另外一種方式

其餘相似的方法
find_elements_by_name
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
查找元素
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')    #訪問url
input = browser.find_element_by_id('q')  #經過id=q獲取input框
input.send_keys('iPhone') #在input框中輸入iphone
time.sleep(1)
input.clear()   #清除了input框的內容
input.send_keys('iPad') # 在input框中輸入了ipad
button = browser.find_element_by_class_name('btn-search') # 獲取了搜索按鈕
button.click() 點擊搜索按鈕

更多操做: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement


交互動做
將動做附加到動做鏈中串行執行
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')    # 應該是把當前的doc切換到了內部的id=iframeResult的iframe中
source = browser.find_element_by_css_selector('#draggable') #經過css選擇器找到#draggable
target = browser.find_element_by_css_selector('#droppable') #經過css選擇器找到#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



執行JavaScript
在作元素交互時,可能有些操做沒有提供api,好比如今想要實現進度條下拉的動做,直接用selenium api實現是頗有難度的
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') # 就是執行JavaScript API;這是比較萬能的辦法
browser.execute_script('alert("To Bottom")')
元素交互操做
.get_attribute('class')#查看該對象的class屬性
.text#查看該對象的文本值
獲取ID、位置、標籤名、大小
.id
.location
.tag_name
.size
獲取元素信息

 

-------------------------------------------------------Frame--------------------------------------------------------

Frame   iframe就是主頁面裏面包含了一個子頁面,是徹底獨立的;想要查找frame中的元素,browser必須切換到frame中才能查找

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult') #切換到id=iframeResult的iframe中
source = browser.find_element_by_css_selector('#draggable') #獲取元素對象
print(source)
try:
    logo = browser.find_element_by_class_name('logo') #這個logo實際是在父frame中,就是在該iframe外面
except NoSuchElementException:#捕捉錯誤:沒有查找到該元素
    print('NO LOGO')
browser.switch_to.parent_frame()#切換到父frame
logo = browser.find_element_by_class_name('logo')  #查找成功
print(logo)
print(logo.text)   

-----------------------------------------選項卡管理(瀏覽器多窗口)---------------------------------------------
切換handle

browser = webdriver.Chrome()
browser.get('https://www.baidu.com') 
browser.execute_script('window.open()') #其實就是執行javascript語句,打開一個新的選項卡
# chrome瀏覽器是有設置快捷鍵打開新選項卡,因此固然也可使用這種方式;上面的方式更加萬能
print(browser.window_handles)#能夠看到是一個list,裏面包含了2個對象:['CDwindow-90F7B5B7CA3830BA23B39FB1BDD120DF', 'CDwindow-961FFA7CF284E748BE76CEB23ACE094A']
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')


-----------------------------------------切入彈窗-----------------------------------------
切入:driver.switch_to_alert()

切出/回到原始頁面
使用與上面三種方法:self.driver.switch_to.default_content() #返回原始driver

頁面的刷新
我只是以爲極可能不少人不知道這個:driver.refresh()
切換Frame、handle、彈窗

 

有時能夠用time.sleep這種簡單粗暴的方式

隱式等待,默認的時間是0
當使用了隱式等待執行測試的時候,若是 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則拋出找不到元素的異常, 換句話說,當查找元素或元素並無當即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0

browser = webdriver.Chrome()
browser.implicitly_wait(10)#執行selenium時,可能某些ajax請求還未加載完畢,因此須要手動設置等待時間。 #設置隱式等待時間10秒,
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')若瀏覽器成功加載,已找到目標對象,則不會等待着10秒
print(input) #selenium返回的元素對象類型爲selenium.webdriver.remote.webelement.WebElement
<selenium.webdriver.remote.webelement.WebElement (session="b29214772d59e912f1ac52e96ed29abe", element="0.12886805191194894-1")>


(看起來隱式等待只能設置時間,而顯式等待不止能夠設置等待時間,還能夠設置各類判斷條件)
顯式等待(更經常使用)

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)  #猜想應該是返回了一個WebDriverWait對象,指定了顯示等待時間10秒
input = wait.until(EC.presence_of_element_located((By.ID, 'q'))) # 最長等待10秒,嘗試獲取元素對象;若失敗,則拋出異常
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

顯示等待條件
title_is 標題是某內容
title_contains 標題包含某內容
presence_of_element_located 元素加載出,傳入定位元組,如(By.ID, 'p')
visibility_of_element_located 元素可見,傳入定位元組
visibility_of 可見,傳入元素對象
presence_of_all_elements_located 全部元素加載出
text_to_be_present_in_element 某個元素文本包含某文字
text_to_be_present_in_element_value 某個元素值包含某文字
frame_to_be_available_and_switch_to_it frame加載並切換
invisibility_of_element_located 元素不可見
element_to_be_clickable 元素可點擊
staleness_of 判斷一個元素是否仍在DOM,可判斷頁面是否已經刷新
element_to_be_selected 元素可選擇,傳元素對象
element_located_to_be_selected 元素可選擇,傳入定位元組
element_selection_state_to_be 傳入元素對象以及狀態,相等返回True,不然返回False
element_located_selection_state_to_be 傳入定位元組以及狀態,相等返回True,不然返回False
alert_is_present 是否出現Alert
詳細內容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions
隱式等待、顯式等待
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() # 關閉瀏覽器
前進、後退

 

 

#-----------------------PhantomJS設置代理-------------------------------------
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

proxy = Proxy(
    {
    'proxyType': ProxyType.MANUAL,
    'httpProxy': 'ip:port'  # 代理ip和端口
    }
)
# 配置對象DesiredCapabilities
desired_capabilities = DesiredCapabilities.PHANTOMJS.copy()
# 把代理ip加入配置對象
proxy.add_to_capabilities(desired_capabilities)
driver = webdriver.PhantomJS(
executable_path="/path/of/phantomjs",
desired_capabilities=desired_capabilities
)
driver.get('http://www.ip.cn/')


#---------------------------Firefox設置代理------------------------------------------------
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.http', '127.0.0.1')
profile.set_preference('network.proxy.http_port', 17890)  #端口號爲int
profile.update_preferences()
driver = webdriver.Firefox(firefox_profile=profile)
driver.get('http://www.ip.cn/')

#---------------------------Chrome設置代理------------------------------------------------
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--proxy-server=http://ip:port')  
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver.get('http://www.ip.cn/')
設置代理

 

browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies()) #應該是獲取響應頭裏包含的cookies
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) #設置cookies
print(browser.get_cookies()) #看起來不是響應頭裏包含的cookies,而是有關這個url的全部的cookies
browser.delete_all_cookies() #清空cookies
print(browser.get_cookies())
cookies
from selenium import webdriver
​
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('hello')  #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()
    

詳細文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
異常處理

 

 

from selenium import webdriver

opt = webdriver.ChromeOptions()# 建立chrome參數對象
opt.set_headless()# 把chrome設置成無界面模式,不論windows仍是linux均可以,自動適配對應參數
driver = webdriver.Chrome(options=opt)# 建立chrome無界面對象
driver.get('https://baidu.com/')# 訪問百度
print(driver.page_source)#打印內容



-----------------2種chromedriver無界面方式,推薦使用第二種---------------------

#selenium:3.12.0
#webdriver:2.38
#chrome.exe: 65.0.3325.181(正式版本) (32 位)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()

chrome_options.add_argument('--no-sandbox')#解決DevToolsActivePort文件不存在的報錯

chrome_options.add_argument('window-size=1920x3000') #指定瀏覽器分辨率
chrome_options.add_argument('--disable-gpu') #谷歌文檔提到須要加上這個屬性來規避bug
chrome_options.add_argument('--hide-scrollbars') #隱藏滾動條, 應對一些特殊頁面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加載圖片, 提高速度
chrome_options.add_argument('--headless') #瀏覽器不提供可視化頁面. linux下若是系統不支持可視化不加這條會啓動失敗
chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手動指定使用的瀏覽器位置

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

print('hao123' in driver.page_source)

driver.close() #切記關閉瀏覽器,回收資源
chromedriver無界面方式

 

 

webdriver有時要切iframe,不然會找不到目標元素


phantomjs:不要選!不要選這個!phantomjs相信是不少爬蟲使用者在接觸selenium時使用的的一個瀏覽器了。無頭(無界面)瀏覽器。可是,phantomjs已經放棄維護了,使用中會出現進程沒法正常關閉的狀況,只能經過系統腳本kill,還有一個問題能夠說很是致命了,在driver異常的時候不只沒法正常退出還可能將cpu佔滿,極可能致使你其餘進程的執行失敗。不推薦,真的不推薦。

firefox:沒有phantomjs那兩個問題,用起來相對正常(有種說法是selenium對firefox支持最好)。缺點在於沒有無界面模式(也許有,但我翻了不少文檔都沒找到);在程序異常是會輸出大量日誌文件擠佔磁盤空間(win下默認輸出在c:\windows\temp\)。這兩個缺點相對比較好克服,第一點,反正你通常也不會在你的爬蟲集羣上面的機器進行操做因此影響不大;第二點,寫個腳本讓磁盤空間不足的時候自動刪除這個目錄就行了。

Chrome:我如今使用的是這個。有無界面模式,缺點除了佔點內存也沒什麼(內存佔用並無很誇張,比phantomjs多1/3不到的樣子)。但願谷歌爸爸的Chrome就這樣堅持下去不要出問題。







time.sleep:不是selenium的等待方式,但有時候簡單粗暴出奇跡(緣由看下面)。
implicitly_wait(xx):隱性等待。設置了一個最長等待時間,若是在規定時間內網頁加載完成,則執行下一步,不然一直等到時間截止。
WebDriverWait類:顯式等待,配合until()和until_not()方法。程序每隔x秒看一下,若是條件成立了,則執行下一步,不然繼續等待,直到超過設置的最長時間,而後拋出TimeoutException。
最長的等待時間取決於二者之間的大者,若是隱性等待時間 > 顯性等待時間,則該句代碼的最長等待時間等於隱性等待時間。
網上說implicit_wait、WebDriverWait存在風險會碰見bug,我在使用時是沒碰見網上說法的運行錯誤的bug,可是在使用顯式等待時的確會碰見失效的現象,因此time.sleep出奇跡。
一些坑。。。

 

 

 


參考:https://www.cnblogs.com/zhaof/p/6953241.html
https://cuiqingcai.com/2599.htmlphp

相關文章
相關標籤/搜索