Selenium-Webdriver
Intro:
Selenium是元素se(硒)。這個Selenium(以下簡稱Se)最開始只是一個自動化測試的項目,然后逐漸獨立出來,並演化出了很多部分:Selenium IDE、Selenium Client API、Selenium Webdriver、Selenium Remote Control、Selenium Grid. Se對firefox支持較為友好!webdriver對firefox做了原生支持。並且Selenium IDE是firefox上的一個插件。可惜,Firefox更新了Quantum(57),大改了內核。目前Selenium IDE還是處在不適合當前版本的狀態。
具體詳見:https://www.cnblogs.com/yogayan/p/6710119.html
一、安裝
這里安裝的就是selenium Client API
python: pip install selenium
配合瀏覽器驅動:
chromedriver 歡迎大家翻牆下載:https://sites.google.com/a/chromium.org/chromedriver/downloads。然后找個環境路徑存一下就可以調用了。
IEdriver github下載:https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver 。 同樣環境路徑保存。
注意:IE玩家把internet選項-安全- 四個選項的啟動保護模式都關掉!
PhantomJS 直接解壓,把bin目錄放在環境路徑中
Opera以及geckodriver試了一下,對最新的opera和firefox都不怎么好使。當然可以下載較低的版本使用。(所以以下所有測試都選擇了IE9)
二、基本使用
2.1 啟動瀏覽器
from selenium import webdriver driver=webdriver.Ie() #或者webdriver.Chrome() driver.get('https://www.baidu.com') driver.page_source #拿到所有html內容,注意這里可能顯示不全,因為網速跟不上程序嘛 driver.close() #關閉瀏覽器
2.2 常用接口
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 #這個是標注狀態的 from selenium.webdriver.support.wait import WebDriverWait #這個是等待頁面加載某些元素
2.3 選擇器
1、find_element_by_id 按照id 查找 2、find_element_by_link_text 按照里面的文本查找,比如查找<h1>好呀</h1>find_element_by_link_text("好呀") 3、find_element_by_partial_link_text 按照文本的部分模糊查找,比如查找<h1>好呀</h1>find_element_by_link_text("好") 4、find_element_by_tag_name 按照標簽名 5、find_element_by_class_name 按照類名 6、find_element_by_name 按照name屬性查找 7、find_element_by_css_selector css選擇器的方式查找 8、find_element_by_xpath/find_elements_by_xpath 比較神奇的查找方式
9、所有方式均可以用find_element(By.ID,"lala")這種形式替代
p.s. 一些方法取到的是元素集合,用索引或者for循環取單獨的值。
#顧名思義find_element_by_xpath 就是找一個元素,elements就是找很多元素,返回集合。以下不再討論,只討論elements的情況。 ########## 關鍵符號:// 與 / ################## # / 代表從第一層找 //表示在子子孫孫中找。如果//放在開始就是在整個文檔中找 find_element_by_xpath("/html") #如果是一個斜杠就只能寫html標簽了。 find_elements_by_xpath("//h1") #找到所有的h1標簽 find_elements_by_xpaht("//div//h1/a") #在整個文檔中找div,然后找h1標簽,然后在子標簽中找a標簽 ###########索引############################# find_elements_by_xpath("//a[1]") #取第一個a標簽 ##########按照屬性查找######################### find_elements_by_xpath("//a[@href="image5.html"]) #href是image5.html的a標簽 find_elements_by_xpath(''//a[contains(@href,"image5")]'') #模糊查找 find_element_by_xpath("//*[@name='continue'][@type='button']") #查看屬性name為continue且屬性type為button的所有標簽 find_element_by_xpath('//a[img/@src="image3_thumb.jpg"]') #找到子標簽img的src屬性為image3_thumb.jpg的a標簽
2.4 屬性獲取
標簽屬性: tag.get_attribute('class')
其他屬性: tag.location >>> 拿到x,y坐標位置
tag.size >>> 拿到元素大小(px)
tag.tagname >>> 拿到元素名
tag.id >>> 元素id
三、等待和交互
3.1 等待
1. implicit wait : 在browser.get('xxx')前就設置,針對所有元素有效
browser=webdriver.Ie()
browser.implicitly_wait(10) #10為timeout時間,超過就不等
2. explicit wait: 在browser.get('xxx')之后設置,只針對某個元素有效
#顯式等待:顯式地等待某個ID為content元素被加載 wait=WebDriverWait(browser,10) #broswer為瀏覽器對象,10位timeout時間 wait.until(expected_conditions.presence_of_element_located((By.ID,'content'))) #終於用到expected_conditions這個對象啦
3.2 input操作
input_tag=browser.find_element_by_id('kw') input_tag.clear() #清空輸入框 input_tag.send_keys('百度') input_tag.send_keys(Keys.ENTER) #輸入回車
3.3 鼠標操作
#click tag.click() #自動拖拽 actions=ActionChains(browser) #一個動作對象 actions.drag_and_drop(tag_from,tag_to) #tag_from是被拖拽對象,tag_to是目標所在元素 actions.perform() #action必須有這個perform()。 #可以連着ActionChains(driver).drag_and_drop(tag_from,tag_to).actions.perform() #more humanlike ! ActionChains(browser).click_and_hold(sourse).perform() #點擊然后hold住 ActionChains(browser).move_by_offset(xoffset=2,yoffset=0).perform() #移動 ActionChains(browser).release().perform() #松手
3.4 霸王硬上弓(JS)
browser.execute_script('alert("hello world")') #嘗試在python里寫js代碼
3.5 iframe
存在iframe的html中,在父frame里是無法直接查看到子frame的元素的。所以需要切換。
利用browser.switch_to.frame('iframeResult') 切換到id為iframeResult的frame。調皮的孩子就問了,如果iframe沒有id怎么辦?
利用switch_to.parent_frame()再切回來
四、其他
4.1 瀏覽器選項卡操作
browser.window_handles 就能獲取所有選項卡對象
browser.switch_to_window(browser.window_handles[1]) 切換選項卡
至於打開一個新的選項卡:可以交給js window.open
4.2 異常處理
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
4.3 前進后退
browser.forward() 前進
browser.back() 后退
4.4 cookies
browser.get_cookies()
browser.set_cookie({"key":"value","key2":"value2"}) #設置cookies(不會人工智能的話,只能靠這個了翻過驗證碼了)
