用python操作瀏覽器的三種方式

第一種:selenium導入瀏覽器驅動,用get方法打開瀏覽器,例如:

import time
from selenium import webdriver

def mac():
    driver = webdriver.Firefox()
    driver.implicitly_wait(5)
    driver.get("http://huazhu.gag.com/mis/main.do")


第二種:通過導入python的標準庫webbrowser打開瀏覽器,例如:


>>> import webbrowser
>>> webbrowser.open("C:\\Program Files\\Internet Explorer\\iexplore.exe")
True
>>> webbrowser.open("C:\\Program Files\\Internet Explorer\\iexplore.exe")
True 

第三種:使用Splinter模塊模塊

一、Splinter的安裝
Splinter的使用必修依靠Cython、lxml、selenium這三個軟件。所以,安裝前請提前安裝
Cython、lxml、selenium。以下給出鏈接地址:
1)http://download.csdn.net/detail/feisan/4301293
2)http://code.google.com/p/pythonxy/wiki/AdditionalPlugins#Installation_no
3)http://pypi.python.org/pypi/selenium/2.25.0#downloads
4)http://splinter.cobrateam.info/


二、Splinter的使用
  這裏,我給出自動登錄126郵箱的案例。難點是要找到頁面的賬戶、密碼、登錄的頁面元素,這裏需要查看126郵箱登錄頁面的源碼,才能找到相關控件的id.

  例如:輸入密碼,密碼的文本控件id是pwdInput.可以使用browser.find_by_id()方法定位到密碼的文本框,

接着使用fill()方法,填寫密碼。至於模擬點擊按鈕,也是要先找到按鈕控件的id,然後使用click()方法。


#coding=utf-8  
import time  

from splinter import Browser  
  
def splinter(url):  
    browser = Browser()  
    #login 126 email websize  
    browser.visit(url)  
    #wait web element loading  
    time.sleep(5)  
    #fill in account and password  
    browser.find_by_id('idInput').fill('xxxxxx')  
    browser.find_by_id('pwdInput').fill('xxxxx')  
    #click the button of login  
    browser.find_by_id('loginBtn').click()  
    time.sleep(8)  
    #close the window of brower  
    browser.quit()  
  
if __name__ == '__main__':  
    websize3 ='http://www.126.com'  
    splinter(websize3) 

WebDriver簡介


selenium從2.0開始集成了webdriver的API,提供了更簡單,更簡潔的編程接口。selenium webdriver的目標是提供一個設計良好的面向對象的API,提供了更好的支持進行web-app測試。從這篇博客開始,將學習使用如何使用python調用webdriver框架對瀏覽器進行一系列的操作


打開瀏覽器

在selenium+python自動化測試(一)–環境搭建中,運行了一個測試腳本,腳本內容如下:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
print(driver.title)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.close()  

webdriver是一個Web應用程序測試自動化工具,用來驗證程序是否如預期的那樣執行。

webdriver.Chrome():創建一個Chrome瀏覽器的webdriver實例


driver.get(“http://www.baidu.com“):打開”http://www.baidu.com“頁面


driver.find_element_by_id(“kw”).send_keys(“selenium”)

找到id爲“kw”的元素,在這個頁面上爲百度首頁的搜索框,在其中輸入“selenium”


driver.find_element_by_id(“su”).click():找到id爲“su”的元素並點擊,在這個頁面上爲百度首頁的“百度一下”按鈕

driver.close():退出瀏覽器


運行腳本的第一步是打開瀏覽器,使用webdriver.Chrome()打開谷歌瀏覽器,如果要指定其他瀏覽器,比如要使用Firefox或者IE瀏覽器,更換瀏覽器名稱就可以了


driver = webdriver.Chrome() //打開Chrome瀏覽器
driver = webdriver.Firefox() //打開Firefox瀏覽器
driver = webdriver.Ie() //打開IE瀏覽器


第二步操作是打開頁面,使用driver.get(url)方法來打開網頁鏈接,例如腳本中打開百度首頁


driver.get("http://www.baidu.com")

接下來是print(driver.title),使用driver.title獲取當前頁面的title,title就是在瀏覽器tab上顯示的內容,例如百度首頁的標題是“百度一下,你就知道”

瀏覽器前進後退

在當前頁面打開一個新的鏈接後,如果想回退到前一個頁面,使用如下driver.back(),相當於點擊了瀏覽器的後退按鈕


和back操作對應的是瀏覽器前進操作driver.forward(),相當於點擊了瀏覽器的前進按鈕

driver.back() //回到上一個頁面
driver.forward() //切換到下一個頁面

瀏覽器運行後,如果頁面沒有最大化,可以調用driver.maximize_window()將瀏覽器最大化,相當於點擊了頁面右上角的最大化按鈕

driver.maximize_window() //瀏覽器窗口最大化

driver.set_window_size(800, 720) //設置窗口大小爲800*720

瀏覽器截屏操作,參數是截屏的圖片保存路徑:

driver.get_screenshot_as_file("D:/data/test.png")   屏幕截圖保存爲***

driver.refresh() //重新加載頁面,頁面刷新

在測試腳本運行完後,一般會在最後關閉瀏覽器,有兩種方法關閉瀏覽器,close()方法用於關閉當前頁面,quit()方法關閉所有和當前測試有關的瀏覽器窗口

driver.close() //關閉當前頁面

driver.quit() //關閉所有由當前測試腳本打開的頁面  

<h1 class="csdn_top" line-height:38px;color:#2c3033;padding:0px="" 29px;white-space:normal;"="" style="word-wrap: break-word; color: rgb(0, 0, 0); font-family: "sans serif", tahoma, verdana, helvetica; margin-top: 0px; margin-bottom: 0px; font-size: 24px;">頁面元素定位
要定位頁面元素,需要找到頁面的源碼。

IE瀏覽器中,打開頁面後,在頁面上點擊鼠標右鍵,會有“查看源代碼”的選項,點擊後就會進入頁面源碼頁面,在這裏就可以找到頁面的所有元素


使用Chrome瀏覽器打開頁面後,在瀏覽器的地址欄右側有一個圖標,點擊這個圖標後,會出現許多菜單項,選擇更多工具裏的開發者工具,就會出現頁面的源碼,不同版本的瀏覽器菜單選項可能不同,但是都會在開發者工具裏找到頁面的源碼


Firefox瀏覽器打開頁面後,在右鍵菜單裏也可以找到“查看頁面源代碼”的選項。在Firefox中,可以使用瀏覽器自帶的插件查看定位元素,在Firefox的附加組件裏搜索firebug進行下載,安裝firebug組件後會在瀏覽器的工具欄中多出一個小蟲子的圖標,點擊這個圖標就可以打開組件查看頁面源碼,打開後如下圖所示

這裏寫圖片描述
以百度首頁搜索頁面爲例,看一下webdriver定位元素的八種方式


使用id定位

在頁面源碼中找到搜索輸入框的元素定義



可以看到輸入框有一個有一個id的屬性,調用find_element_by_id()根據id屬性來找到元素,參數爲屬性的值


input_search = driver.find_element_by_id("kw")

使用name定位


使用find_element_by_name()根據name屬性找到元素,參數爲name屬性的值

搜索框有一個name=”wd”的屬性,使用name查找搜索輸入框元素

input_search = driver.find_element_by_name("wd")

使用className定位


使用find_element_by_class_name()根據className屬性找到元素,參數爲className屬性的值

搜索框有一個class=”s_ipt”的屬性,使用className查找元素

input_search = driver.find_element_by_class_name("s_ipt")


使用tagName定位


使用find_element_by_tag_name()根據tagName屬性找到元素,參數爲元素標籤的名稱

每個頁面的元素都有一個tag,搜索框的標籤爲input,有時候一個頁面裏有許多相同的標籤,所以用這種方法找到的元素一般都不準確,除非這個元素使用的標籤在這個頁面裏是唯一的。一般不會使用這種方式來定位元素

input_search = driver.find_element_by_class_name("input")

使用link_text定位

頁面上都會有一些文本鏈接,點擊鏈接後會打開一個新的頁面,這些可以點擊的鏈接可以使用find_element_by_link_text來定位,百度首頁上方有如下幾個元素
這裏寫圖片描述

例如要定位“新聞”,找到元素的代碼,有一個href的屬性,這是點擊後打開的頁面

新聞

使用link_text查找元素,參數爲元素的文本信息

news = driver.find_element_by_link_text("新聞")

使用partial_link_text定位


這種方式類似於link_text的定位方式,如果一個元素的文本過長,不需要使用文本的所有信息,可以使用其中的部分文本就可以定位


使用partial_link_text查找百度首頁的“新聞”元素,參數爲文本信息,可以使用全部的文本,也可以使用部分文本

news = driver.find_element_by_link_text("新聞") //使用全部文本

news = driver.find_element_by_link_text("新") //使用部分文本

使用css selector定位


使用css屬性定位元素有多種方法,可以使用元素的id、name、className,也可以使用元素的其他屬性,如果一個元素沒有上述的幾種屬性或者定位不到時,可以使用css來定位

還是使用百度搜索框的實例來說明css定位的用法




css使用元素的id定位

css屬性使用id定位時,使用#號表示元素的id

input_search = driver.find_element_by_css_selector("#kw") //使用元素的id定位

css使用元素的class定位

css屬性使用class定位時,使用.號表示元素的class

input_search = driver.find_element_by_css_selector(".s_ipt") //使用元素的class定位


css使用元素的tag定位

css屬性使用tagName定位時,直接使用元素的標籤


input_search = driver.find_element_by_css_selector("input") //使用元素的tagName定位


css使用元素的其他屬性

除了上述3種屬性,css屬性可以使用元素的其他屬性定位,格式如下


input_search = driver.find_element_by_css_selector("[maxlength='255']") 

使用元素的maxlength屬性定位

input_search = driver.find_element_by_css_selector("[autocomplete='off']") 

使用元素的autocomplete屬性定位

可以在參數中加入元素的標籤名稱

input_search = driver.find_element_by_css_selector("input#kw") //使用元素的id定位

input_search = driver.find_element_by_css_selector("input.s_ipt") //使用元素的class定位

driver.find_element_by_css_selector("input[maxlength='255']") //使用元素的maxlength屬性定位

input_search = driver.find_element_by_css_selector("input[autocomplete='off']") //使用元素的autocomplete屬性定位


css的層級定位

當一個元素使用自身的屬性不容易定位時,可以通過它的父元素來找到它,如果父元素也不好定位,可以再通過上元素來定位,以此類推,一直找到容易定位的父元素爲止,通過層級定位到需要查找的元素

通過Firefox的firebug組件查看百度首頁的源碼
這裏寫圖片描述

通過層級來定位搜索框


input_search = driver.find_element_by_css_selector("form#form>span:nth-child(1)>input")

input_search = driver.find_element_by_css_selector("form.fm>span:nth-child(1)>input")


搜索框的父元素爲span標籤,span的父元素爲form,form有id和class屬性,可以通過這兩個屬性來定位,找到form元素後,form下有多個span標籤,所以要使用span:nth-child(1),表示form下的第一個span標籤,這種用法很容易理解,表示第幾個孩子,最後是span下的input標籤,span下只有一個input,所以就可以定位到搜索框

css邏輯運算

用一個屬性來定位元素時,如果有其他元素的屬性和此元素重複,可以組合多個屬性來功共同定位

組合多個屬性定位元素定位百度搜索框

input_search = driver.find_element_by_css_selector("input[id='kw'][name='wd']")

在元素內定義的屬性,都可以使用css來定位,使用其他幾種方式無法定位到元素時,可以使用css,夠強大!

使用xpath定位


XPath是一種在XML文檔中定位元素的語言。因爲HTML可以看做XML的一種實現,所以selenium用戶可是使用這種強大語言在web應用中定位元素。xpath也可以通過元素的各種屬性定位到元素

使用元素屬性定位

input_search = driver.find_element_by_xpath("//*[@id='kw']") //通過元素id查找元素

input_search = driver.find_element_by_xpath("//*[@name='wd']") //通過元素name查找元素

input_search = driver.find_element_by_xpath("//*[@class='s_ipt']") //通過元素class查找元素

input_search = driver.find_element_by_xpath("//*[@maxlength='255']") //通過其他屬性查找元素
input_search = driver.find_element_by_xpath("//*[@autocomplete='off']") //通過其他屬性查找元素

前面的*號表示查找所有的標籤元素,可以替換爲標籤名稱,更準確的定位元素


input_search = driver.find_element_by_xpath("//input[@id='kw']") //通過元素id查找元素

input_search = driver.find_element_by_xpath("//input[@name='wd']") //通過元素name查找元素

input_search = driver.find_element_by_xpath("//input[@class='s_ipt']") //通過元素class查找元素

input_search = driver.find_element_by_xpath("//input[@maxlength='255']") //通過其他屬性查找元素
input_search = driver.find_element_by_xpath("//input[@autocomplete='off']") //通過其他屬性查找元素


xpath也可以通過層級來定位,定位方式
這裏寫圖片描述
input_search =driver.find_element_by_xpath("//input[@id='form']//span[1]//input")

driver.find_element_by_xpath("//input[@class='fm']//span[1]//input")


查找效果和通過css的層級定位是相同的,意思是form元素下面的第一個span元素的input標籤子元

xpath的邏輯元素通過    and運算符     來組合元素屬性

input_search = driver.find_element_by_xpath("//input[@id='kw' and name='wd']")


屬性匹配
xpath中還有一種更強大的定位方式,通過模糊匹配元素的屬性


news = driver.find_element_by_xpath("//a[contains(text(), '新聞')]"

查找text中包含"新聞"的元素

input_search = driver.find_element_by_xpath("//input[contains(@id, 'kw']"

查找id中包含"kw"的元素

input_search = driver.find_element_by_xpath("//input[starts-with(@id, 'k']"

查找id以"k"開頭的元素

input_search = driver.find_element_by_xpath("//input[ends-with(@id, 'w']"

查找id以"w"結尾的元素

input_search = driver.find_element_by_xpath("//input[matchs(@id, 'k*']"

利用正則表達式查找元素

上面介紹了查找頁面元素的八種方法,通過這些方式找到的都是單個元素,如果需要批量查找元素,還有和上面方式對應的八種複數形式


find_elements_by_id

find_elements_by_name

find_elements_by_class_name

find_elements_by_tag_name

find_elements_by_link_text

find_elements_by_partial_link_text

find_elements_by_css_selector

find_elements_by_xpath


這8種方法查找到的是一組元素,返回的是list,可以通過索引來操作元素

例如頁面上的複選框和單選框,或者頁面上有多個屬相相同的輸入框,這些屬性相同的一組元素,可以批量獲取,然後過濾出需要操作的元素,選擇其中的一個或者多個進行操作

通過百度首頁搜索“selenium”關鍵字,會出現許多搜索結果,這些搜索結果具有相同的屬性,不同的是屬性的值不同,定位這些元素時,可以使用批量定位的方法

看下面的代碼

這裏寫圖片描述這是搜索selenium關鍵字後的頁面結果,每一個搜索結果都是可點擊的鏈接,定位這些元素的方法:

search_results = driver.find_elements_by_css_selector("h.t>a")

search_results[3].click() //通過索引點擊第4條搜索結果

第二個例子



   
   
       

checkbox


       


           


               
                    checkbox1
                   


                        
                   


               
               
                    checkbox2
                   


                        
                   


               
               
                    checkbox3
                   


                        
                   


               
           


       


   

這個頁面上有3個複選框,打開後如下圖所示:

這裏寫圖片描述


操作複選框

//查找所有的複選框並點擊
checkboxs = driver.find_element_by_xpath('input[@type="checkbox"]')

返回一個list

for checkbox in checkboxs:
            checkbox.click()

//點擊最後一個複選框

checkboxs[2].click()


from selenium import webdriver

driver=webdriver.Firefox()

driver.get(r'http://www.baidu.com/')

print 'driver attributes:'

print dir(driver)


elem=driver.find_element_by_id('kw')


print 'WebElement attributes:'

print dir(elem) 

瀏覽器屬性:

driver attributes:

['NATIVE_EVENTS_ALLOWED', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_file_detector', '_is_remote', '_mobile', '_switch_to', '_unwrap_value', '_wrap_value', 'add_cookie', 'application_cache', 'back', 'binary', 'capabilities', 'close', 'command_executor', 'create_web_element', 'current_url', 'current_window_handle', 'delete_all_cookies', 'delete_cookie', 'desired_capabilities', 'error_handler', 'execute', 'execute_async_script', 'execute_script', 'file_detector', 'find_element', 'find_element_by_class_name', 'find_element_by_css_selector', 'find_element_by_id', 'find_element_by_link_text', 'find_element_by_name', 'find_element_by_partial_link_text', 'find_element_by_tag_name', 'find_element_by_xpath', 'find_elements', 'find_elements_by_class_name', 'find_elements_by_css_selector', 'find_elements_by_id', 'find_elements_by_link_text', 'find_elements_by_name', 'find_elements_by_partial_link_text', 'find_elements_by_tag_name', 'find_elements_by_xpath', 'firefox_profile', 'forward', 'get', 'get_cookie', 'get_cookies', 'get_log', 'get_screenshot_as_base64', 'get_screenshot_as_file', 'get_screenshot_as_png', 'get_window_position', 'get_window_size', 'implicitly_wait', 'log_types', 'maximize_window', 'mobile', 'name', 'orientation', 'page_source', 'profile', 'quit', 'refresh', 'save_screenshot', 'session_id', 'set_page_load_timeout', 'set_script_timeout', 'set_window_position', 'set_window_size', 'start_client', 'start_session', 'stop_client', 'switch_to', 'switch_to_active_element', 'switch_to_alert', 'switch_to_default_content', 'switch_to_frame', 'switch_to_window', 'title', 'w3c', 'window_handles']
 
調用說明:

driver.屬性值

變量說明:
1.driver.current_url:用於獲得當前頁面的URL

2.driver.title:用於獲取當前頁面的標題

3.driver.page_source:用於獲取頁面html源代碼

4.driver.current_window_handle:用於獲取當前窗口句柄

5.driver.window_handles:用於獲取所有窗口句柄 

函數說明:

1.driver.find_element*():定位元素,
2.driver.get(url):瀏覽器加載url。
實例:driver.get("http//:www.baidu.com")
3.driver.forward():瀏覽器向前(點擊向前按鈕)。
4.driver.back():瀏覽器向後(點擊向後按鈕)。
5.driver.refresh():瀏覽器刷新(點擊刷新按鈕)。
6.driver.close():關閉當前窗口,或最後打開的窗口。
7.driver.quit():關閉所有關聯窗口,並且安全關閉session。

8.driver.maximize_window():最大化瀏覽器窗口。
9.driver.set_window_size(寬,高):設置瀏覽器窗口大小。
10.driver.get_window_size():獲取當前窗口的長和寬。
11.driver.get_window_position():獲取當前窗口座標。
12.driver.get_screenshot_as_file(filename):截取當前窗口。

實例:driver.get_screenshot_as_file('D:/selenium/image/baidu.jpg')

13.driver.implicitly_wait(秒):隱式等待,通過一定的時長等待頁面上某一元素加載完成。
若提前定位到元素,則繼續執行。若超過時間未加載出,則拋出NoSuchElementException異常。

實例:driver.implicitly_wait(10) #等待10秒

14.driver.switch_to_frame(id或name屬性值):切換到新表單(同一窗口)。若無id或屬性值,可先通過xpath定位到iframe,再將值傳給switch_to_frame()

15.driver.switch_to.parent_content():跳出當前一級表單。該方法默認對應於離它最近的switch_to.frame()方法。

16.driver.switch_to.default_content():跳回最外層的頁面。
17.driver.switch_to_window(窗口句柄):切換到新窗口。
18.driver.switch_to.window(窗口句柄):切換到新窗口。
19.driver.switch_to_alert():警告框處理。處理JavaScript所生成的alert,confirm,prompt.

20.driver.switch_to.alert():警告框處理。
21.driver.execute_script(js):調用js。

22.driver.get_cookies():獲取當前會話所有cookie信息。

23.driver.get_cookie(cookie_name):返回字典的key爲“cookie_name”的cookie信息。

實例:driver.get_cookie("NET_SessionId")

24.driver.add_cookie(cookie_dict):添加cookie。“cookie_dict”指字典對象,必須有name和value值。
25.driver.delete_cookie(name,optionsString):刪除cookie信息。

26.driver.delete_all_cookies():刪除所有cookie信息。 

頁面元素屬性:

WebElement attributes:

['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_execute', '_id', '_parent', '_upload', '_w3c', 'clear', 'click', 'find_element', 'find_element_by_class_name', 'find_element_by_css_selector', 'find_element_by_id', 'find_element_by_link_text', 'find_element_by_name', 'find_element_by_partial_link_text', 'find_element_by_tag_name', 'find_element_by_xpath', 'find_elements', 'find_elements_by_class_name', 'find_elements_by_css_selector', 'find_elements_by_id', 'find_elements_by_link_text', 'find_elements_by_name', 'find_elements_by_partial_link_text', 'find_elements_by_tag_name', 'find_elements_by_xpath', 'get_attribute', 'id', 'is_displayed', 'is_enabled', 'is_selected', 'location', 'location_once_scrolled_into_view', 'parent', 'rect', 'screenshot', 'screenshot_as_base64', 'screenshot_as_png', 'send_keys', 'size', 'submit', 'tag_name', 'text', 'value_of_css_property']
 
調用說明:
driver.find_element*.屬性值

element=driver.find_element*
element.屬性值
 
變量說明:
1.element.size:獲取元素的尺寸。
2.element.text:獲取元素的文本。
3.element.tag_name:獲取標籤名稱。
 
函數說明:
1.element.clear():清除文本。
2.element.send_keys(value):輸入文字或鍵盤按鍵(需導入Keys模塊)。
3.element.click():單擊元素。
4.element.get_attribute(name):獲得屬性值
5.element.is_displayed():返回元素結果是否可見(True 或 False)
6.element.is_selected():返回元素結果是否被選中(True 或 False)
7.element.find_element*():定位元素,用於二次定位。


網頁自動化最基本的要求就是要定位到各個元素,然後才能對該元素進行各種操作(輸入,點擊,清除,提交等)。


以百度搜索輸入框爲例,具體說明各個定位方式的用法:

(通過chrome瀏覽器查看元素或者搜狐瀏覽器的firebug查看,即可看到html源碼)

注意點:第三行的元素是灰色的,該元素是不可定位到的,下方會說明。










1.通過id定位元素

如果id不是動態的,一個頁面的id是唯一的。最簡單的定位方式。

使用:find_element_by_id("id_vaule")

實例:find_element_by_id("kw")

注意點:有些id值是動態變化的,則不能使用該方法定位。如下:id就是動態的,每次進入頁面,該id都會改變

郵箱帳號或手機號

2.通過class_name定位元素

classname有可能重複哦。 

使用:find_element_by_class_name("class_name_vaule")

實例:find_element_by_class_name("s_ipt")

 3.通過tag_name定位元素

標籤名字最容易重複,不過,當定位一組數據時,可使用。


使用:find_element_by_tag_name("tag_name_vaule")


實例:find_element_by_tag_name("input")


注意點:當定位一組元素時:可勾選一組複選框。如下:


find_element_by_tag_name("input")
 

 

checkbox

 

 


 

checkbox1



 


 
 

checkbox2



 


 
 

checkbox3



 


 
 


 


 
 


4.通過name定位元素

name有可能會重複哦。 

使用:find_element_by_name("name_vaule")

實例:find_element_by_name("wd")

5.通過link文字精確定位元素

登錄

使用:find_element_by_link_text("text_vaule")

實例:find_element_by_link_text("登錄")

6.通過link文字模糊定位元素

使用:find_element_by_partial_link_text("部分text_vaule")


實例:find_element_by_partial_link_text("登")

7.通過CSS定位元素

CSS(Cascading Style Sheets)是一種語言,它用來描述HTML和XML文檔的表現。CSS可以較爲靈活的選擇控件的任意屬性,一般情況下會比XPath快。且語法也比較簡潔。

使用:find_element_by_css_selector("CSS")

實例:


7.1通過id屬性定位元素


#號表示通過id屬性來定位元素


find_element_by_css_selector("#kw")


7.2通過class屬性定位元素


.號表示通過class屬性來定位元素


find_element_by_css_selector(".s_ipt")


7.3通過標籤名定位元素


find_element_by_css_selector("input")


7.4通過屬性定位元素(挺常用的)


find_element_by_css_selector("[name='wd']")


find_element_by_css_selector("[maxlength='255']")


屬性值包含某個值


屬性值包含wd:適用於由空格分隔的屬性值。


find_element_by_css_selector("[name~='wd']")


7.5父子定位元素


查找有父親元素的標籤名爲span,它的所有標籤名叫input的子元素


find_element_by_css_selector("span>input") 


7.6組合定位元素


標籤名#id屬性值:指的是該input標籤下id屬性爲kw的元素


find_element_by_css_selector("input#kw")


標籤名.class屬性值:指的是該input標籤下class屬性爲s_ipt的元素


find_element_by_css_selector("input.s_ipt")


標籤名[屬性=’屬性值‘]:指的是該input標籤下name屬性爲wd的元素


find_element_by_css_selector("input[name='wd']")


父元素標籤名>標籤名.class屬性值:指的是span下的input標籤下class屬性爲s_ipt的元素


find_element_by_css_selector("span>input.s_ipt")


 多個屬性組合定位元素(挺常用的)


指的是input標籤下id屬性爲kw且name屬性爲wd的元素


find_element_by_css_selector("input.s_ipt[name='wd']")


指的是input標籤下name屬性爲wd且maxlength爲255的元素


find_element_by_css_selector("input[name='wd'][maxlength='255']"


8.通過XPath定位元素

XPath是一種XML文檔中定位元素的語言。該定位方式也是比較常用的定位方式。

使用:find_element_by_xpath("XPath")


8.1通過屬性定位元素

find_element_by_xpath("//標籤名[@屬性='屬性值']")

id屬性:find_element_by_xpath("//input[@id='kw']")

class屬性:find_element_by_xpath("//input[@class='s_ipt']")

name屬性:find_element_by_xpath("//input[@name='wd']")

maxlength屬性:find_element_by_xpath("//input[@maxlength='255']")

8.2通過標籤名定位元素

指所有input標籤元素         find_element_by_xpath("//input")


8.3父子定位元素


查找有父親元素的標籤名爲span,它的所有標籤名叫input的子元素

find_element_by_xpath("//span/input"

8.4根據元素內容定位元素(非常實用)


find_element_by_xpath("//p[contains(text(),'京公網')]"
 

京公網安備11000002000001號


注:contains的另一種用法

//input[contains(@class,'s')]     說明class屬性包含s的元素


8.5組合定位元素

//父元素標籤名/標籤名的屬性值:指的是span下的input標籤下class屬性爲s_ipt的元素

find_element_by_xpath("//span/input[@class='s_ipt']")

多個屬性組合定位(挺常用的)

指的是input標籤下id屬性爲kw且name屬性爲wd的元素

find_element_by_xpath("//input[@class='s_ipt' and @name='wd']")

指的是p標籤下內容包含“京公網”且id屬性爲jgwab的元素

find_element_by_xpath("//p[contains(text(),'京公網') and @id='jgwab']")  

比較懶惰的方法:

使用搜狐瀏覽器的firebug工具,複製XPath路徑,不過這種方式對層級要求高,到時候自己再修改下。

9.通過By定位元素

使用:find_element(定位的類型,具體定位方式)


定位的類型包括By.ID,By.NAME,By.CLASS_NAME,By.TAG_NAME,By.LINK_TEXT,By.PARTIAL_LINK_TEXT,By.XPATH,By.CSS_SELECTOR

具體定位方式參考上方1-8的說明。


實例:find_element(By.ID,'kw')


注意:使用By定位方式,需先導入By類


from selenium.webdriver.common.by import By
 
10.具體實例說明

下方例子是登陸126郵件,然後發送郵件。


1 # coding=utf-8
 2 '''
 3 Created on 2016-7-27
 4 @author: Jennifer
 5 Project:發送郵件
 6 '''
 7 from selenium import webdriver
 8 import time
 9 
10 from test_5_2_public import Login  #由於公共模塊文件命名爲test_5_2_public
11 driver=webdriver.Firefox()
12 driver.implicitly_wait(30)
13 driver.get(r'http://www.126.com/')  #字符串加r,防止轉義。
14 time.sleep(3)
15 driver.switch_to.frame('x-URS-iframe')
16 #調用登錄模塊
17 Login().user_login(driver)
18 time.sleep(10)
19 #發送郵件
20 #點擊發件箱
21 #_mail_component_61_61是動態id,所以不能用於定位
22 #driver.find_element_by_css_selector('#_mail_component_61_61>span.oz0').click()
23 #不能加u"//span[contains(text(),u'寫 信')]",否則定位不到。
24 #以下定位是查找span標籤有個文本(text)包含(contains)'寫 信' 的元素,該定位方法重要
25 driver.find_element_by_xpath("//span[contains(text(),'寫 信')]").click()
26 #填寫收件人
27 #driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'[email protected]')
28 driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'[email protected]')
29 #填寫主題
30 #通過and連接更多的屬性來唯一地標誌一個元素
31 driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @maxlength='256']").send_keys(u'自動化測試')
32 #填寫正文
33 #通過switch_to_frame()將當前定位切換到frame/iframe表單的內嵌頁面中
34 driver.switch_to_frame(driver.find_element_by_class_name('APP-editor-iframe'))
35 #在內嵌頁面中定位郵件內容位置
36 emailcontext=driver.find_element_by_class_name('nui-scroll')
37 #填寫郵件內容
38 emailcontext.send_keys(u'這是第一封自動化測試郵件')
39 #通過switch_to().default_content()跳回最外層的頁面
40 #注:不要寫成switch_to().default_content(),否則報AttributeError: SwitchTo instance has no __call__ method
41 driver.switch_to.default_content()
42 #driver.switch_to.parent_frame()
43 #點擊發送
44 time.sleep(3)
45 #有可能存在元素不可見(查看元素是灰色的),會報ElementNotVisibleException錯誤
46 #包含發送二字的元素很多,所以還得再加上其他限制
47 #sendemails=driver.find_element_by_xpath("//span[contains(text(),'發送')]")
48 sendemails=driver.find_element_by_xpath("//span[contains(text(),'發送') and @class='nui-btn-text']")
49 time.sleep(3)
50 
51 #校驗郵件是否發送成功
52 try:
53     assert '發送成功' in driver.page_source
54 except AssertionError:
55     print '郵件發送成功'
56 else:
57     print '郵件發送失敗'
58 
59 #調用退出模塊    
60 Login().user_logout(driver)


元素定位說明:
1.代碼22行,定位不到是因爲id是動態的,所以需採取其他方式定位元素。

2.代碼25行,是根據元素內容來定位的,具體用法詳看8.4.

3.代碼28行,是根據class名來定位元素的,由於該值在該頁面上是唯一的,所以可以用它來定位。

4.代碼31行,是使用邏輯運算符and連接更多的屬性從而唯一的標誌一個元素,具體用法詳看8.5.

5.代碼34行,由於使用內嵌的iframe框架,所以需要先使用switch_to_frame()移到該表單上,才能定位該表單上的元素,非常重要,否則無論怎麼定位都會報“NoSuchElementException”,找不到該元素。

6.代碼41行,跳出iframe框架,當框架內的動作操作完畢後,需要使用switch_to.default_content跳出iframe框架,非常重要。


7.代碼47行,由於內容包括“發送”的元素中包含不可見元素(html查看元素可以看到此行是灰色的),這樣有可能定位到不可見元素,會報“ElementNotVisibleException”。

8.代碼48行,是使用邏輯運算符and連接更多的屬性從而唯一的標誌一個元素,具體用法詳看8.5.這樣可以排除掉那個不可見元素。 


1.Frame/Iframe原因定位不到元素:
  這個是最常見的原因,首先要理解下frame的實質,frame中實際上是嵌入了另一個頁面,而webdriver每次只能在一個頁面識別,因此需要先定位到相應的frame,對那個頁面裏的元素進行定位。

解決方案:

如果iframe有name或id的話,直接使用switch_to_frame("name值")或switch_to_frame("id值")

​如下:
driver=webdriver.Firefox()
driver.get(r'http://www.126.com/')
driver.switch_to_frame('x-URS-iframe')  #需先跳轉到iframe框架
username=driver.find_element_by_name('email')
username.clear()
 
如果iframe沒有name或id的話,則可以通過下面的方式定位:
#先定位到iframe
elementi= driver.find_element_by_class_name('APP-editor-iframe')
#再將定位對象傳給switch_to_frame()方法
driver.switch_to_frame(elementi) 
 
如果完成操作後,
可以通過switch_to.parent_content()方法跳出當前iframe,或者還可以通過switch_to.default_content()方法跳回最外層的頁面。


 
2.Xpath描述錯誤原因:

     由於Xpath層級太複雜,容易犯錯。但是該定位方式能夠有效定位絕大部分的元素,建議掌握。
解決方案:

2.1可以使用Firefox的firePath,複製xpath路徑。該方式容易因爲層級改變而需要重新編寫過xpath路徑,不建議使用,初學者可以先複製路徑,然後嘗試去修改它。

2.2提高下寫xpath的水平。


 
如何檢驗編寫的Xpath是否正確?編寫好Xpath路徑,可以直接複製到搜狐瀏覽器的firebug查看html源碼,通過Xpath搜索:如下紅色框,若無報錯,則說明編寫的Xpath路徑沒錯。

find_element_by_xpath("//input[@id='kw']") 

​3.頁面還沒有加載出來,就對頁面上的元素進行的操作:
     這種情況一般說來,可以設置等待,等待頁面顯示之後再操作,這與人手工操作的原理一樣:
3.1設置等待時間;缺點是需要設置較長的等待時間,案例多了測試就很慢;
3.2設置等待頁面的某個元素出現,比如一個文本、一個輸入框都可以,一旦指定的元素出現,就可以做操作。
3.3在調試的過程中可以把頁面的html代碼打印出來,以便分析。

解決方案:
導入時間模塊。
import time
time.sleep(3)
 
4.動態id定位不到元素:
解決方案:
如果發現是動態id,直接用xpath定位或其他方式定位。 

​​


5.二次定位,如彈出框登錄

     如百度登錄彈出框登錄百度賬號,需先定位到百度彈出框,然後再定位到用戶名密碼登錄。


# coding=utf-8
'''
Created on 2016-7-20
@author: Jennifer
Project:登錄百度賬號
'''
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")

time.sleep(3)

#點擊登錄:有些name爲tj_login的元素爲不可見的,點擊可見的那個登錄按鈕即可。
#否則會報:ElementNotVisibleException
element0=driver.find_elements_by_name("tj_login")
for ele0 in element0:
    if ele0.is_displayed():
        ele0.click()


#在登錄彈出框,需先定位到登錄彈出框
#否則會報:NoSuchElementException
element1=driver.find_element_by_class_name("tang-content")
element11=element1.find_element_by_id("TANGRAM__PSP_8__userName")
element11.clear()
element11.send_keys("登錄名")


element2=element1.find_element_by_id("TANGRAM__PSP_8__password")
element2.clear()
element2.send_keys("密碼")


element3=element1.find_element_by_id("TANGRAM__PSP_8__submit")
element3.click()
element3.submit()


try:
    assert "登錄名" in driver.page_source
except AssertionError:
    print "登錄失敗"
else:
    print "登錄成功"
    time.sleep(3)
finally:
    print "測試記錄:已測試"
driver.close()




6.不可見元素定位


     如上百度登錄代碼,通過名稱爲tj_login查找的登錄元素,有些是不可見的,所以加一個循環判斷,找到可見元素(is_displayed())點擊登錄即可。




轉自 http://www.cnblogs.com/yufeihlf/p/5717291.html#test0
轉自 http://blog.csdn.net/zh175578809/article/details/76376838

轉自 https://blog.csdn.net/chengxuyuanyonghu/article/details/79154468

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章