1、selenium是什么奔脐?
Selenium 是一個用于Web應(yīng)用程序測試的工具俄周。Selenium測試直接運行在瀏覽器中吁讨,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11)峦朗,Mozilla Firefox建丧,Safari,Google Chrome甚垦,Opera等茶鹃。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上涣雕。測試系統(tǒng)功能——創(chuàng)建回歸測試檢驗軟件功能和用戶需求艰亮。支持自動錄制動作和自動生成 .Net、Java挣郭、Perl等不同語言的測試腳本迄埃。(轉(zhuǎn)自百度百科)
2、python中的selenium使用
代碼鏈接:https://github.com/princewen/python3_crawl
先來看一段完整的的代碼:
"""基本使用"""
fromseleniumimportwebdriver
fromselenium.webdriver.common.byimportBy
fromselenium.webdriver.common.keysimportKeys
fromselenium.webdriver.supportimportexpected_conditionsasEC
fromselenium.webdriver.support.waitimportWebDriverWait
browser=webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
#找到百度的輸入框
input=browser.find_element_by_id('kw')
#在輸入框中輸入python
input.send_keys('Python')
#回車進行搜索
input.send_keys(Keys.ENTER)
#等待10s
wait=WebDriverWait(browser,10)
#直到contnet_left元素出現(xiàn)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))
#打印當前url
print(browser.current_url)
#打印當前的cookie
print(browser.get_cookies())
#打印當前的源代碼
print(browser.page_source)
finally:
? ? browser.close()
在上面的代碼中兑障,我們先使用Chrome內(nèi)核構(gòu)造了一個瀏覽器侄非,獲取到了百度的鏈接,隨后找到了百度輸入框元素流译,在輸入框中輸入python并回車逞怨,相當于使用百度搜索python,使用顯式等待頁面內(nèi)容出現(xiàn)福澡,最后我們打印了url叠赦、cookie和頁面源代碼。
接下來我們將詳細介紹selenium的功能革砸。
2.1 訪問頁面
使用get方法請求一個頁面
browser=webdriver.Chrome()browser.get('https://www.taobao.com')print(browser.page_source)browser.close()
2.2 查找元素
查找元素分為查找一個元素或者查找多個元素除秀,可以使用通用的方法或者非通用方法,在通用方法中需要通過By的方式指定查找方式算利。查找方式可以通過id册踩、class、name效拭、xpath等形式暂吉。
#單個元素#除了下面的方式外,還有其它方式browser=webdriver.Chrome()browser.get('https://www.taobao.com')input_first=browser.find_element_by_id('q')input_second=browser.find_element_by_css_selector('#q')input_third=browser.find_element_by_xpath('//*[@id="q"]')print(input_first,input_second,input_third)browser.close()#通用方式browser=webdriver.Chrome()browser.get('https://www.taobao.com')input_first=browser.find_element(By.Id,'q')print(input_first)browser.close()#查找多個元素browser=webdriver.Chrome()browser.get('https://www.taobao.com')lis=browser.find_elements_by_css_selector(('.service-bd li'))lis_2=browser.find_elements(By.CSS_SELECTOR,'.service-bd li')#返回一個列表print(lis)print(lis_2)browser.close()
2.3 元素交互操作
元素的交互操作缎患,比如在文標框中輸入文字借笙、清除文本框中的文字,點擊按鈕等等较锡。
importtimebrowser=webdriver.Chrome()browser.get('https://www.taobao.com')input=browser.find_element_by_id('q')input.send_keys('iPhone')time.sleep(1)input.clear()input.send_keys('iPad')button=browser.find_element_by_class_name('btn-search')button.click()
2.4 交互動作
交互動作使用ActionChains业稼,這里的代碼展示了把元素從一個位置拖動到另一個位置的代碼。
fromselenium.webdriverimportActionChainsbrowser=webdriver.Chrome()url='http://www.runoob.com/try/try.php?filename=jqueryul-api=dropable'browser.get(url)#切換到iframebrowser.switch_to.frame('iframeResult')source=browser.find_element_by_css_selector('#draggable')target=browser.find_element_by_css_selector('#droppable')actions=ActionChains(browser)actions.drag_and_drop(source,target)actions.perform()
2.5 執(zhí)行javascript
browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')browser.execute_script('alert("To Bottom")')browser.close()
2.6 獲取元素屬性
可以通過get_attribute方法得到元素屬性蚂蕴,對于某些關(guān)鍵字低散,直接使用.就可以獲得俯邓。
"""獲取元素屬性"""browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')logo=browser.find_element_by_id('zh-top-link-logo')print(logo)# 獲取classprint(logo.get_attribute('class'))input=browser.find_element_by_class_name('zu-top-add-question')#獲取文本print(input.text)#獲取其他信息print(input.id)print(input.location)print(input.tag_name)print(input.size)
2.7 切換frame
頁面之間frame的切換,需要注意的是在子frame中無法獲得父frame的元素熔号。
fromselenium.common.exceptionsimportNoSuchElementExceptionbrowser=webdriver.Chrome()url='http://www.runoob.com/try/try.php?filename=jqueryul-api=dropable'browser.get(url)#切換到iframebrowser.switch_to.frame('iframeResult')source=browser.find_element_by_css_selector('#draggable')try:logo=browser.find_element_by_class_name('logo')except NoSuchElementException:print('NO LOGO')browser.switch_to.parent_frame()logo=browser.find_element_by_class_name('logo')print(logo)print(logo.text)
2.8 等待
等待分為隱式等待和顯式等待稽鞭。在隱式等待中,只需要指定一個等待時間引镊,當我們獲取元素時朦蕴,如果超過等待時間還沒有獲取到元素,會拋出異常弟头。顯示等待構(gòu)造WebDriverWait對象吩抓,調(diào)用其until方法指定一個元素并制定相應(yīng)的等待形式,如元素的加載赴恨,元素可點擊等等疹娶,如果超過等待時間指定的元素沒有呈現(xiàn)或者不可點擊,那么就會拋出異常伦连。
browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')"""隱式等待"""browser.implicitly_wait(10)"""如果這個元素沒有找到的話雨饺,會等待10s,如果還沒有找到惑淳,就會拋出異常"""logo=browser.find_element_by_id('zh-top-link-logo')print(logo)# 獲取classprint(logo.get_attribute('class'))browser.close()"""顯示等待"""
fromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWait
browser=webdriver.Chrome()browser.get('https://www.taobao.com/')wait=WebDriverWait(browser,10)#參數(shù)是元組额港,還有其他一些等待條件input=wait.until(EC.presence_of_element_located((By.ID,'q')))button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))browser.close()
2.9 前進后退
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()
2.10? cookies操作
browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')print(browser.get_cookies())browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})print(browser.get_cookies())browser.delete_all_cookies()print(browser.get_cookies())
2.11 選項卡管理
browser=webdriver.Chrome()browser.get('https://www.baidu.com')browser.execute_script('window.open()')print(browser.window_handles)browser.switch_to_window(browser.window_handles[1])browser.get('https://www.zhihu.com/explore')browser.switch_to_window(browser.window_handles[0])browser.get('https://python.org')browser.close()
2.12 異常處理
fromselenium.common.exceptionsimportNoSuchElementException,TimeoutExceptionbrowser=webdriver.Chrome()try:browser.get('https://www.baidu.com')except TimeoutException:print('TIme out')try:browser.find_element_by_id('hello')except NoSuchElementException:print('NOT FOUND')