selenium基礎操做

selenium

一、打開和關閉網頁

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from selenium import webdriver

driver = webdriver.Firefox()
# 也可指定驅動和瀏覽器
# binary = FirefoxBinary('/usr/bin/firefox')
# driver = webdriver.Firefox(firefox_binary=binary, executable_path="/home/zk/scrapy_dazhong/geckodriver")

# 設置初始座標位置
driver.set_window_position(x=500, y=60)

# 設置窗口大小
# driver.set_window_size(width=300, height=200)

# 將瀏覽器最大化顯示
driver.maximize_window()

# 打開瀏覽器並輸入網址
driver.get("http://www.baidu.com")
# 後退訪問頁
# driver.back()
# 前進訪問頁
# driver.forward()

time.sleep(10)

# close()用於關閉當前窗口,quit()用於退出驅動程序並關閉全部相關窗口.
driver.quit()

# 關閉瀏覽器
# driver.close()

二、獲取信息

# 獲取頁面title
now_title = driver.title
print now_title
# 獲取當前url
now_url = driver.current_url
print now_url
# 獲取頁面詳情代碼(HTML)
print driver.page_source

三、查找元素

"""
在webdriver中,支持的找元素的方法有
查找方法                                        對應元素
find_element_by_id                       id
find_element_by_name                 name
find_element_by_class_name         class name
find_element_by_tag_name           tag name
find_element_by_link_text             link text
find_element_by_partial_link_text   partial link text
find_element_by_xpath                 xpath
find_element_by_css_selector         css selector
"""
# 根據Id獲取標籤
inputelement = driver.find_element_by_id('kw')

# 清除輸入框內容
inputelement.clear()

# 輸入框輸入信息
inputelement.send_keys("biubiubiu")

# 觸發點擊事件
driver.find_element_by_id('su').click()

# 經過 submit() 來提交操做
driver.find_element_by_id("dl_an_submit").submit()

# 獲取百度輸入框的寬高
size=driver.find_element_by_id("kw").size
print size

# 獲取百度底部的文本信息
text=driver.find_element_by_id("cp").text
print text

# 獲取元素的屬性值,能夠是 id、name、type 或元素擁有的其它任意屬性
attribute=driver.find_element_by_id("kw").get_attribute('type')
print attribute

# 獲取元素的結果是否可見,返回結果爲 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
print result

 四、鼠標操做

"""
ActionChains 類鼠標操做的經常使用方法:
    context_click() 右擊
    double_click() 雙擊
    drag_and_drop() 拖動
    move_to_element() 鼠標懸停在一個元素上
    click_and_hold() 按下不放鼠標左鍵在一個元素
    release()   在某個元素上釋放鼠標
"""
# 定位元素
right =driver.find_element_by_xpath("kw")

# 對定位到的元素執行鼠標右鍵操做
ActionChains(driver).context_click(inputelement).perform()

# 對定位到的元素執行鼠標雙擊操做
ActionChains(driver).double_click(inputelement).perform()

# ####鼠標拖動####
# 定位元素的原位置
element = driver.find_element_by_id("lg")
# 定位元素要移動到的目標位置
target = driver.find_element_by_class_name("qrcode-img")
# 執行元素的移動操做
ActionChains(driver).drag_and_drop(element, target).perform()

time.sleep(3)
su = driver.find_element_by_id("su")
# 對定位到的元素執行鼠標移動到上面的操做
ActionChains(driver).move_to_element(su).perform()
time.sleep(3)
# 對定位到的元素執行鼠標左鍵按下不放的操做
ActionChains(driver).click_and_hold(su).perform()
# 在指定元素上釋放鼠標
ActionChains(driver).release(su)

 實例:css

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
import random

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')

dragger = driver.find_element_by_id('dragger')  # 被拖拽元素
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]')  # 目標元素1
item2 = driver.find_element_by_xpath('//div[text()="Item 2"]')  # 目標2
item3 = driver.find_element_by_xpath('//div[text()="Item 3"]')  # 目標3
item4 = driver.find_element_by_xpath('//div[text()="Item 4"]')  # 目標4
# action = ActionChains(driver)
# 按下鼠標不放
ActionChains(driver).click_and_hold(on_element=dragger).perform()
sleep(3)
for i in range(1, 50):
    print "--->i", i
    # 移動 110
    ActionChains(driver).move_to_element_with_offset(to_element=dragger, xoffset=60, yoffset=55).perform()
    sleep(random.randint(3, 5)/100)
# 釋放鼠標
ActionChains(driver).release(on_element=dragger).perform()

# action = ActionChains(driver)
# action.drag_and_drop(dragger, item1).perform()  # 1.移動dragger到目標1
# sleep(2)
# action.click_and_hold(dragger).release(item2).perform()  # 2.效果與上句相同,也能起到移動效果
# sleep(2)
# action.click_and_hold(dragger).move_to_element(item3).release().perform()  # 3.效果與上兩句相同,也能起到移動的效果
# sleep(2)
# action.drag_and_drop_by_offset(dragger, 400, 150).perform()  # 4.移動到指定座標

# action.click_and_hold(dragger).move_by_offset(400, 150).release().perform()  # 5.與上一句相同,移動到指定座標
# sleep(2)
# driver.quit()

# 借鑑其它大神的代碼!!!具體忘記在哪看到的了,若有侵權,請告知,立改

 五、鍵盤操做

"""
經常使用
send_keys(Keys.BACK_SPACE) 刪除鍵(BackSpace)
send_keys(Keys.SPACE) 空格鍵(Space)
send_keys(Keys.TAB) 製表鍵(Tab)
send_keys(Keys.ESCAPE) 回退鍵(Esc)
send_keys(Keys.ENTER) 回車鍵(Enter)
send_keys(Keys.CONTROL,'a') 全選(Ctrl+A)
send_keys(Keys.CONTROL,'c') 複製(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘貼(Ctrl+V)
Keys 類所提供的按鍵請查閱 webdriver API
"""

# 輸入框輸入內容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
# 刪除最後一個字符
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
# 輸入空格鍵+「教程」
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
time.sleep(3)
# ctrl+a 全選輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
# ctrl+x 剪切輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
time.sleep(3)
# 輸入框從新輸入內容,搜索
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
time.sleep(3)
# 經過回車鍵盤來代替點擊操做
driver.find_element_by_id("su").send_keys(Keys.ENTER)

 六、設置超時時間

"""
sleep():設置固定休眠時間.python的time 包提供了休眠方法sleep(),導入time包後就可使用sleep(),進行腳本的執行過程進行休眠.
implicitly_wait():是 webdirver 提供的一個超時等待.隱示等待一個元素被發現,或一個命令完成.若是超出了設置時間的則拋出異常.
WebDriverWait():一樣也是 webdirver 提供的方法.在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,若是超過設置時間檢測不到則拋出異常.
"""
# 隱示等待:implicitly_wait
# 至關於設置全局的等待,在定位元素時,對全部元素設置超時時間,超出了設置時間則拋出異常
# 隱式等待使得WebDriver在查找一個Element或者Element數組時,每隔一段特定的時間就會輪詢一次DOM,若是Element或數組沒有立刻被發現的話。
# 默認設置是0。
# 一旦設置,這個隱式等待會在WebDriver對象實例的整個生命週期起做用
driver.implicitly_wait(10)

# WebDriverWait主要提供了兩個方法,一個是until()(元素出現), 另一個是until_not()(元素消失)
# until(method, message=’’)
# 調用該方法提供的驅動程序做爲一個參數,直到返回值不爲 False。
# until_not(method, message=’’)
# 調用該方法提供的驅動程序做爲一個參數,直到返回值爲 False

# 等待時長10秒,默認0.5秒詢問一次
WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("kw")).send_keys("yoyo")
time.sleep(3)
# 判斷id爲kw元素是否消失,設置等待時長10秒,詢問時間爲1秒
is_disappeared = WebDriverWait(driver, 10, 1).until_not(lambda x: x.find_element_by_id("kw").is_displayed())
print is_disappeared

 七、定位一組對象

"""
使用場景:
    批量操做對象,好比將頁面上全部的 checkbox 都勾上
    先獲取一組對象,再在這組對象中過濾出須要具體定位的一些對象.好比定位出頁面上全部的 checkbox,而後選擇最後一個.
* find_elements 用於獲取一組元素
元素存儲在list中,可進行任意操做
"""
# 選擇頁面上全部的 tag name 爲 input 的元素
inputs = driver.find_elements_by_tag_name('input')
# 選擇頁面上全部的 css name 爲 input 的元素
inputs_ = driver.find_elements_by_css_selector('input[type=checkbox]')
# 而後從中過濾出type爲checkbox 的元素,單擊勾選
for item in inputs:
    if item.get_attribute('type') == 'checkbox':
        item.click()

 八、層級定位

menu = driver.find_element_by_id('login-ul').find_element_by_link_text(u'關閉的項目').click()

 實例:html

# 設置等待(low的辦法)
tmp = 10
while tmp > 0:
    time.sleep(3)
    result = driver.find_element_by_link_text(u"當即體驗").is_displayed()
    print result
    tmp -= 1
    if result:
        driver.find_element_by_link_text(u"當即體驗").click()
        time.sleep(10)
        tmp = 0

# 設置等待(較爲方便)
# WebDriverWait(driver, 30).until(lambda driver: driver.find_element_by_link_text(u"當即體驗").is_displayed())
# driver.find_element_by_link_text(u"當即體驗").click()

print u"已跳轉頁面%s" %driver.current_url

button_ = driver.find_elements_by_css_selector('button[data-toggle="dropdown"]')
button_[0].click()
# 在父親元件下找到 link 爲 Action 的子元素
time.sleep(2)
# 層級定位,先找到login-ul的列表,在找到列表的某個元素
menu = driver.find_element_by_id('login-ul').find_element_by_link_text(u'關閉的項目').click()
# 找到元素直接click與下方方法結果一致
ActionChains(driver).click(menu).perform()

 九、IFrame標籤

"""
在 web 應用中常常會出現 frame 嵌套的應用,假設頁面上有 A、B 兩個 frame,
其中 B 在 A 內,那麼 定位 B 中的內容則須要先到 A,而後再到 B.
switch_to_frame 方法能夠把當前定位的主體切換了 frame 裏
"""
# 進入到iframe標籤裏
driver.switch_to_frame(name="login_frame")

 實例:自動化登錄QQ郵箱,並獲取全部的郵件標題的示例java

# 找到iframe中
driver.switch_to_frame(name="login_frame")
# 在當前iframe中匹配
user = driver.find_element_by_xpath(".//*[@id='u']")
user.send_keys("賬號")    # 輸入你的帳號
time.sleep(1)
password = driver.find_element_by_xpath(".//*[@id='p']")
password.send_keys("密碼")    # 輸入你的密碼
time.sleep(2)
driver.find_element_by_xpath(".//*[@id='login_button']").click()    # 點擊登錄按鈕

print u"已跳轉頁面%s"%driver.current_url
time.sleep(5)

# selenium.common.exceptions.WebDriverException: Message: TypeError: can't access dead object
# 解決報錯方法
driver.switch_to_default_content()
# time.sleep(3)

# QQ郵箱有獨立密碼設置的,須要增長此步驟,沒有能夠省略
js = 'document.getElementById("pp").setAttribute("_focus","1");'
driver.execute_script(js)
time.sleep(2)
# 匹配獨立密碼輸入框
duli_pwd = driver.find_element_by_id("pp")
duli_pwd.send_keys("密碼")    # 輸入你的獨立密碼
# 點擊獨立密碼登錄按鈕
driver.find_element_by_xpath(".//*[@id='btlogin']").click()
time.sleep(2)
print u"已跳轉頁面%s"%driver.current_url
time.sleep(2)
# #######################登錄成功後##################################
# 登錄後點擊收件箱
driver.find_element_by_xpath(".//*[@id='folder_1']").click()
# 切入郵箱的IFrame中
driver.switch_to_frame("mainFrame")
time.sleep(5)

def test():
    # 獲取網頁信息
    content = driver.page_source
    # lxml
    content_ = etree.HTML(content)
    # 查找是否有下一頁的標籤
    next_page = content_.xpath(".//*[@id='nextpage1']/text()")
    if not next_page:
        return
    # 未讀郵件列表
    if_mail_list = content_.xpath(".//*[@class='i F']")
    # 已讀郵件列表
    im_mail_list = content_.xpath(".//*[@class='i M']")
    for item in if_mail_list:
        from_name = item.xpath("./tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span/text()")
        main_ = item.xpath("./tbody/tr/td[3]/table/tbody/tr/td[3]/div[1]/u/text()")
        print u"未讀--->", u"來自:", from_name[0].strip() if from_name else u"哦...", u"主題:", main_[0].strip() if main_ else u"沒..."

    for item in im_mail_list:
        from_name = item.xpath("./tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span/text()")
        main_ = item.xpath("./tbody/tr/td[3]/table/tbody/tr/td[3]/div[1]/u/text()")
        print u"已讀--->", u"來自:", from_name[0].strip() if from_name else u"哦...", u"主題:", main_[0].strip() if main_ else u"沒..."
    time.sleep(3)
    # 點擊下一頁
    driver.find_element_by_xpath(".//*[@id='nextpage1']").click()
    time.sleep(3)
    test()
if __name__ == '__main__':
    test()

十、多窗口操做

"""
要想在多個窗口之間切換,首先要得到每個窗口的惟一標識符號(句柄)經過得到的句柄來區別
分不一樣的窗口,從而對不一樣窗口上的元素進行操做
window_handles #返回的全部窗口的句柄到當前會話
switch_to_window() # 得到當前窗口
用於處理多窗口操做的方法,與咱們前面學過的 switch_to_frame() 是相似,switch_to_window()用於 處理多窗口以前切換,switch_to_frame() 用於處理多框架的切換。# nowhandle=driver.current_window_handle# driver.find_element_by_xpath(".//*[@id='u1']/a[7]").click()
"""
time.sleep(5)# print u"當前窗口", nowhandle# 打開註冊新窗口
driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_10__submitWrapper']/a[1]").click()
time.sleep(3)
driver.implicitly_wait(3)
allhandles=driver.window_handles
print u"全部窗口", allhandles
# 循環判斷窗口是否爲當前窗口
for handle in allhandles:
    if handle != nowhandle:
#         跳轉窗口
        driver.switch_to_window(handle)
        print 'now register window!'
        # 切換到郵箱註冊標籤
        driver.close()
# 回到原先的窗口
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"註冊成功!")

 十一、alert/confirm/prompt操做

"""
alert(彈框)/confirm(彈框帶確認取消按鈕)/prompt(帶輸入框的彈框)

text 返回 alert/confirm/prompt 中的文字信息
accept 點擊確認按鈕
dismiss 點擊取消按鈕,若是有的話
send_keys 輸入值,這個 alert\confirm 沒有對話框就不能用了,否則會報錯
"""
# 進入iframe標籤
driver.switch_to_frame("i")
time.sleep(5)
# 找到按鈕點擊
driver.find_element_by_xpath("html/body/input").click()
time.sleep(3)
# 獲取網頁上的警告信息
alert_obj = driver.switch_to_alert()
time.sleep(2)
# 取警告信息,不能+()
print alert_obj.text
# 輸入值(若是有的話)
alert_obj.send_keys("abc")
time.sleep(2)
# 點擊確認按鈕
alert_obj.accept()
# 點擊取消按鈕(若是有的話)
alert_obj.dismiss()

 十二、文件上傳

driver.implicitly_wait(3)
# 定位上傳按鈕,添加本地文件
file_path = '/home/zk/testsub/abc.txt'
# send_keys 不只能夠寫入信息,也能夠上傳文件
driver.find_element_by_xpath(".//*[@id='post-5071']/div/ol[3]/li[4]/label").send_keys(file_path)
time.sleep(2)

 1三、文件下載

只是大體嘗試了一下,具體狀況等待之後有需求在測試
"""
browser.download.dir 用於指定你所下載文件的目錄
os.getcwd() 該函數不須要傳遞參數,用於返回當前的目錄
application/octet-stream 爲內容的類型
"""
import os
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("https://pypi.python.org/packages/d0/b1/1c9d9cc3fd6c1cd802d897d78a9ea5ad01b07c6c0f422b235717b74270ae/selenium-3.7.0-py2.py3-none-any.whl#md5=52fc71d16b86204e467002c1930d7b65")
browser.find_element_by_xpath(".//*[@id='post-5071']/div/ol[3]/li[4]/label").click()

 1四、執行JS

"""
webdriver 提供了 execute_script() 接口用來調用 js 代碼。
執行 JS 通常有兩種場景:
    1:一種是在頁面上直接執行 JS
    2:另外一種是在某個已經定位的元素上執行 JS
execute_script(script, *args)
在當前窗口/框架 同步執行 javaScript
script:JavaScript 的執行。
*args:適用任何 JavaScript 腳本
"""
# ######經過 JS 隱藏選中的元素##########第一種方法:
# 隱藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
time.sleep(5)
# 隱藏按鈕:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)

實例:滑動滾動條python

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
# 將頁面滾動條拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
# 將滾動條移動到頁面的頂部
js_="var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)
time.sleep(3)

 1五、cookie操做

"""
webdriver 操做 cookie 的方法有:
    get_cookies() 得到全部 cookie 信息
    get_cookie(name) 返回特定 name 有 cookie 信息
    add_cookie(cookie_dict) 添加 cookie,必須有 name 和 value 值
    delete_cookie(name) 刪除特定(部分)的 cookie 信息
    delete_all_cookies() 刪除全部 cookie 信息
"""
# 把cookie保存到本地
post = {}
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:
    post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt', 'w') as f:
    f.write(cookie_str)
print("cookies信息已保存到本地")

# 取出cookie
with open('cookie.txt', 'r', encoding='utf-8') as f:
    cookie = f.read()
cookies = json.loads(cookie)
相關文章
相關標籤/搜索