1. 程式人生 > 其它 >Selenium元素定位、WebDriver瀏覽器

Selenium元素定位、WebDriver瀏覽器

  1 from selenium import  webdriver
  2 import time
  3 
  4 # 對webdriver進行例項化,指定測試用的瀏覽器
  5 driver=webdriver.Chrome()
  6 # 導航到被測試的網址
  7 driver.get("https://www.baidu.com/")
  8 #休眠
  9 time.sleep(3)
 10 #退出瀏覽器
 11 driver.quit()
 12 
 13 '''id元素屬性'''
 14 # driver=webdriver.Chrome()
 15 # driver.get("https://www.baidu.com")
16 # #send_keys---→輸入的意思 17 # driver.find_element_by_id("kw").send_keys("軟體測試") 18 # time.sleep(2) 19 # driver.quit() 20 21 '''name元素屬性''' 22 # driver=webdriver.Chrome() 23 # driver.get("https://www.baidu.com") 24 # #send_keys---→輸入的意思 25 # driver.find_element_by_name("wd").send_keys("軟體測試")
26 # time.sleep(3) 27 # driver.quit() 28 29 '''class_name元素屬性''' 30 # driver=webdriver.Chrome() 31 # driver.get("https://www.baidu.com") 32 # #send_keys---→輸入的意思 33 # driver.find_element_by_class_name("s_ipt").send_keys("軟體測試") 34 # time.sleep(3) 35 # driver.quit() 36 37 '''css和xpath: 38
當你使用id、name、class_name都定位不到的時候,這個時候考慮使用css或xpath''' 39 40 '''xpath''' 41 # driver=webdriver.Chrome() 42 # driver.get("https://www.baidu.com") 43 # #send_keys---→輸入的意思 44 # driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input").send_keys("軟體測試") 45 # time.sleep(3) 46 # driver.quit() 47 48 # '''css''' 49 # driver=webdriver.Chrome() 50 # driver.get("https://www.baidu.com") 51 # #send_keys---→輸入的意思 52 # driver.find_element_by_css_selector('#kw').send_keys("軟體測試") 53 # time.sleep(3) 54 # driver.quit() 55 56 '''LINK_TEXT:超連結 57 PARTIAL_LINK_TEXT:也是處理超連結,但是是模糊搜尋''' 58 # driver=webdriver.Chrome() 59 # driver.get("https://www.baidu.com") 60 # #click:點選 61 # # driver.find_element_by_link_text('新聞').click() #超連結 62 # driver.find_element_by_partial_link_text('新聞').click() #模糊搜尋超連結 63 # time.sleep(3) 64 # driver.quit() 65 66 ''' 67 元素定位的分類 68 1、單個元素定位 69 2、多個元素定位,多個元素定位指的是元素的屬性都一致,那麼這個時候它返回的是列表, 70 可以根據列表的索引來定位元素屬性 71 3、不管是單個元素定位還是多個元素定位,它的方法都是8種 72 ''' 73 74 '''tagName''' 75 driver=webdriver.Chrome() 76 driver.get("https://www.baidu.com") 77 # send_key()--→輸入的意思 78 # driver.find_element_by_tag_name("input").send_keys("軟體測試") 79 tags=driver.find_elements_by_tag_name("input") 80 # print(type(tags)) 81 # for item in tags: 82 # print(item) 83 tags[7].send_keys("軟體測試") 84 time.sleep(2) 85 driver.quit() 86 87 '''實戰''' 88 # driver=webdriver.Chrome() 89 # driver.get("https://mail.sina.com.cn/") 90 # driver.find_element_by_id("freename").send_keys("jrq") #使用者名稱輸入框 91 # time.sleep(2) 92 # driver.find_element_by_id("freepassword").send_keys("123456") #密碼輸入框 93 # time.sleep(2) 94 # driver.find_element_by_class_name("loginBtn").click() #登入 95 # time.sleep(3) 96 # driver.quit() 97 98 '''獲取測試的地址''' 99 # driver=webdriver.Chrome() 100 # driver.get("https://mail.sina.com.cn/") 101 # print(driver.current_url) #當前地址 102 # assert driver.current_url.endswith("sina.com.cn/") 103 # driver.quit() 104 105 '''獲取當前頁面程式碼''' 106 # driver=webdriver.Chrome() 107 # driver.get("https://mail.sina.com.cn/") 108 # print(driver.page_source) 109 # driver.quit() 110 111 '''獲取頁面的title''' 112 # driver=webdriver.Chrome() 113 # driver.get("https://www.baidu.com/") 114 # print(driver.title) 115 # assert driver.title=="百度一下,你就知道" #判斷title是否是這個 116 # driver.quit() 117 118 '''頁面的前進與後退''' 119 # driver=webdriver.Chrome() 120 # #瀏覽器最大化 121 # driver.maximize_window() 122 # driver.get("https://www.bing.com/") 123 # time.sleep(3) 124 # driver.get("https://www.baidu.com/") 125 # time.sleep(3) 126 # #後退 127 # driver.back() 128 # print("當前地址:",driver.current_url) 129 # time.sleep(3) 130 # #前進 131 # driver.forward() 132 # print("當前地址:",driver.current_url) 133 # time.sleep(3) 134 # driver.quit() 135 136 '''多視窗解決問題思路''' 137 # driver=webdriver.Chrome() 138 # driver.maximize_window() #瀏覽器最大化 139 # driver.get("https://mail.sina.com.cn/") 140 # #然後獲取當前頁面放在一個變數中 141 # nowHandle=driver.current_window_handle 142 # time.sleep(3) 143 # driver.find_element_by_link_text("註冊").click() 144 # time.sleep(3) 145 # #獲取所有頁面並且放在一個變數中 146 # allHandlers=driver.window_handles 147 # #迴圈所有頁面,判斷如果不是當前頁面,那麼就是在新的頁面 148 # for handler in allHandlers: 149 # if handler!=nowHandle: 150 # #從當前頁面切換到新的頁面 151 # driver.switch_to.window(handler) 152 # driver.find_element_by_name("email").send_keys("123456") 153 # time.sleep(3) 154 # #關閉新的瀏覽器 close關閉當前視窗,quit退出驅動並關閉所有關聯的視窗 155 # driver.close() 156 # #切換到原來的頁面 157 # driver.switch_to.window(nowHandle) 158 # time.sleep(5) 159 # driver.find_element_by_id("freename").send_keys("qwhytr") 160 # time.sleep(3) 161 # driver.quit() 162 163 '''clear():清空''' 164 # driver=webdriver.Chrome() 165 # driver.maximize_window() 166 # driver.get("https://www.baidu.com/") 167 # so=driver.find_element_by_id("kw") #把輸入框定義為一個變數,方便進行輸入和清空 168 # so.send_keys("很百度") 169 # time.sleep(3) 170 # so.clear() 171 # time.sleep(3) 172 # driver.quit() 173 174 '''get_attribute()的方法是獲取元素屬性的值''' 175 # driver=webdriver.Chrome() 176 # driver.maximize_window() 177 # driver.get("https://www.baidu.com/") 178 # so=driver.find_element_by_id("kw") 179 # so.send_keys("很百度") 180 # time.sleep(3) 181 # print(so.get_attribute("value")) #獲取輸入框的值(有輸入才能獲取) 182 # driver.quit()
View Code

 

一、元素定位方法

webdriver之所以能夠操作瀏覽器,是因為它首先需要定位到被操作的元素屬性,然後就可以對瀏覽器做各種操作。(通過元素定位到被操作的位置)

 

1.1元素定位方法(八個方法背下來)

(這八個方法的作用是一樣的,都是

ID = "id" (是唯一的,動態的)

NAME = "name"

CLASS_NAME = "class name"

XPATH = "xpath"

LINK_TEXT = "link text"

PARTIAL_LINK_TEXT = "partial link text"

TAG_NAME = "tag name"

CSS_SELECTOR = "css selector"

 

1.2以百度搜索輸入框為例:獲取原始碼

1、在百度首頁右鍵、選擇檢查

 

 

2、出現以下畫面:點1的滑鼠,點2百度的搜尋輸入框,會獲取到3

(百度搜索輸入框的input輸入框的原始碼部分,其中的id、name、class...這些是百度輸入框的屬性。操作時要用到這些)

 

 

 

1.3 id元素屬性

find_element_by_id

以id的屬性來進行定位和具體的操作,從原始碼我們就可以得到它的ID是kw

 

 

 

 

1.4 name元素屬性

以name的屬性來進行定位和具體的操作

find_element_by_name

 

 

 

1.5 class_name元素屬性

 

 

1.6 xpath和css

當你使用id、name、class_name都定位不到的時候,這個時候考慮使用css或xpath

xpath:在輸入框的這行程式碼上右鍵copy,點Copy XPath,在pycharm中貼上(必須單引號)

 

 

 

 

 full xpath:

 

 

 

xpath和full xpath的區別:

一般來說,兩個都可以,具體的:copy後粘貼出來,如果xpath獲取到的是動態屬性,就需要用full xpath。而且xpath必須要單引號。

 

css:

 

 

 

 

√css和xpath的區別:

css選擇 是依據頁面的資料樣式定位的, 有標籤選擇, 類選擇, id選擇, 或者他們的交併集, 除此之外沒有其他的輔助元素了

xpath 是路徑表示式,所有元素和內容都可以成為路徑的一部分. 兩種定位方式功能基本一致, 但是xpath明顯更強大, 只是xpath寫起來較複雜,css寫起來容易些

 

1.7超連結

a標籤裡都是超連結

LINK_TEXT:超連結
PARTIAL_LINK_TEXT:也是處理超連結,但是是模糊搜尋

 (百度主頁裡的新聞超連結)

 

 

二、元素定位的分類

1、單個元素定位
2、多個元素定位,多個元素定位指的是元素的屬性都一致,那麼這個時候它返回的是列表,可以根據列表的索引來定位元素屬性
3、不管是單個元素定位還是多個元素定位,它的方法都是8種

多個元素定位:

tag_name可以理解為標籤,百度搜索輸入框它的標籤就是input。

如下圖,input標籤有很多,針對這種不是唯一的,我們可以使用多個元素定位的方式來解決,其實多個元素定位的核心思想是獲取到的元素屬性是一個列表,我們可以使用列表的索引來進行定位。

比如標籤的方法就是find_elements_by_tag_name(),其他的方法也是相應的,這裡我們先獲取到它的屬性(它的資料是列表),再根據索引定位:

 

 element需要帶s,多個元素定位返回的列表,定義為變數tags,然後根據索引來查詢列表中我們真正要的input元素。(我們定位的百度搜索輸入框的input是在第八位,那麼它的索引就是7)

 

 

 

 

 

實戰:(新浪郵箱)

 

 

 

 

三、WebDriver瀏覽器屬性詳解

3.1獲取測試的地址

assert:

assert是Python原生的斷言方法

a=1

b=1

assert a==b(判斷a等於b)

 

 

 

3.2獲取當前頁面程式碼

做網路爬蟲方面

page_source

該方法為特性方法,屬於只讀屬性

 

 

3.3獲取頁面的title

 

 

3.4頁面的前進與後退

.forward()   是前進

.back()     是後退

 

 

 

√3.5多視窗解決問題思路:

需要實現從當前頁面切換到另外一個新的頁面,那麼這個時候就需要使用到多視窗的操作和實戰。解決步驟:

1、先開啟當前頁面

2、然後獲取當前頁面放在一個變數中

3、開啟新的頁面

4、獲取所有頁面並且放在一個變數中

5、迴圈所有頁面,判斷如果不是當前頁面,那麼就是在新的頁面

 

 

3.6 clear():清空

 

 

3.7獲取元素屬性的值

get_attribute()

(input輸入框輸入的所有值,都放在value中了)