python+selenium-基礎知識

請看連接https://www.cnblogs.com/fengyiru6369/p/7993366.htmlcss

 
1 # coding=utf-8
 2 from selenium import webdriver
 3 driver = webdriver.Firefox()
 4 driver.maximize_window ()
 5 driver.get("https://www.baidu.com")
 6 try:
 7     driver.find_element_by_id("kwf")
 8     print("id is find")
 9 except Exception as e:
10     print("exception find ",format(e))
11 driver.quit()
 

運行結果:html

注:該斷言判斷是否獲取對應的元素,再自動化腳本執行時,能夠定位出現的問題前端

2.利用link text定位元素

1 try:  
2     driver.find_element_by_link_text("新聞")  
3     print ('test pass: element found by link text')  
4 except Exception as e:  
5     print ("Exception found", format(e))

3.利用partial link text定位元素

try:  
    driver.find_element_by_partial_link_text("主頁").click()  
    print ('test pass: element found by partial link text')  
except Exception as e:  
    print ("Exception found", format(e))

注:partial_link_text與link_text連接定位相似,partial link text就是選擇這個元素的link text中一部分字段。web

例如:百度首頁帶連接文字爲:「把百度設爲主頁」。編程

   爲了更好的驗證是否找到了「把百度添加到首頁」這個元素,我在這個地方添加了一個click(),運行代碼,能夠看到確實點擊了這個元素,表明找到了這個元素。瀏覽器

選擇partial link text的時候,須要選擇一個比較惟一的字段,來區分這個元素。post

4.利用class name定位元素

1 try:  
2     driver.find_element_by_class_name("s_ipt")  
3     print ('test pass: element found by class name')  
4 except Exception as e:  
5     print ("Exception found", format(e))

5.利用name定位元素

try:  
    driver.find_element_by_name("wd")  # 這裏百度搜索輸入框有name = 'wd'這個節點信息  
    print ('test pass: element found by name value')  
except Exception as e:  
    print ("Exception found", format(e))

6.利用css定位元素

參考:http://blog.csdn.net/u011541946/article/details/68927139測試

 

7.清楚文本信息

複製代碼
1 # coding=utf-8
 2 from selenium import webdriver
 3 driver = webdriver.Firefox()
 4 driver.maximize_window ()
 5 driver.get("https://www.baidu.com")
 6 driver.find_element_by_id("kw").send_keys("Selenium")
 7 try:
 8     driver.find_element_by_id("kw").clear()
 9     driver.find_element_by_id ("kw1").send_keys ("Selenium")
10     print ('test pass: clean successful')
11 except Exception as e:
12     print ("Exception found", format(e))
13 driver.quit()
複製代碼

8.基本頁面操做方法

driver.refresh() # 刷新方法 refresh  網站

driver.back()  # 從百度新聞後退到百度首頁  ui

driver.forward() # 百度首頁前進到百度新聞 

print(driver.capabilities['version'])  # 打印瀏覽器version的值  

print (driver.current_url)  # current_url 方法能夠獲得當前頁面的URL

print (driver.title)  # title方法能夠獲取當前頁面的標題顯示的字段

在瀏覽器中新開一個界面:

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 from selenium.webdriver.common.keys import Keys
 5 
 6 driver = webdriver.Firefox ()
 7 driver.maximize_window ()
 8 # driver.implicitly_wait (6)
 9 
10 driver.get ("http://www.baidu.com/")
11 time.sleep (1)
12 ele = driver.find_element_by_tag_name ('body').send_keys (Keys.CONTROL + 't')  # 觸發ctrl + t 在瀏覽器中新開一個tab
13 time.sleep (1)
複製代碼

8.點擊單選按鈕-Radio Button

 

勾選一個單選按鈕,就是調用元素方法click()

咱們利用for語句遍歷這兩個單選按鈕,依次點擊他們。

 

 

複製代碼
1 from selenium import webdriver
 2 import time
 3 driver = webdriver.Firefox ()
 4 driver.maximize_window ()
 5 driver.get ('http://news.baidu.com')
 6 # driver.implicitly_wait (8)
 7 print(driver.find_elements_by_xpath ("//*/input[@type='radio']"))
 8 for i in driver.find_elements_by_xpath ("//*/input[@type='radio']"):
 9     i.click ()
10     time.sleep (5)
複製代碼

 9.獲取元素頁面上的文字

複製代碼
1 # coding=utf-8  
 2 import time
 3 from selenium import webdriver
 4 from selenium.webdriver.common.keys import Keys
 5 
 6 driver = webdriver.Firefox ()
 7 driver.maximize_window ()
 8 # driver.implicitly_wait (6)
 9 
10 driver.get ("http://www.baidu.com/")
11 time.sleep (1)
12 driver.find_element_by_xpath ("//*[@id='u1']/a[7]").click ()
13 time.sleep (1)
14 
15 driver.find_element_by_xpath ("//*[@id='TANGRAM__PSP_10__submit']").click ()
16 
17 
18 # 斷言方法二,本文重點介紹方法  
19 error_mes = driver.find_element_by_xpath ("//*[@id='TANGRAM__PSP_10__error']").text
20 print(error_mes)
21 try:
22     assert error_mes == u'請您填寫手機/郵箱/用戶名'
23     print ('Test pass.')
24 except Exception as e:
25     print ("Test fail.", format (e))
複製代碼

注:不一樣版本的火狐瀏覽器,定位的元素會有所不一樣

10.驗證控件是否選中

 

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox ()
 6 driver.maximize_window ()
 7 # driver.implicitly_wait (6)
 8 driver.get ("http://news.baidu.com/")
 9 time.sleep (1)aluse
10 try:
11     # driver.find_element_by_xpath ("//*[@id='news']").is_selected ()
12     assert driver.find_element_by_xpath ("//*[@id='newstitle']").is_selected () == True
13     print ('Test Pass.')
14 except Exception as e:
15     print ('Test fail', format (e))
複製代碼

總結:

元素方法is_selected()返回是是布爾值(True  /Faluse),用來判斷單選或者多選控件是否被選中,或者下拉選擇菜單是否選擇一個默認的option,均可以經過這個方法去判斷。

11.獲取頁面元素的大小

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox ()
 6 driver.maximize_window ()
 7 # driver.implicitly_wait (6)
 8 driver.get ("http://baidu.com/")
 9 time.sleep (1)
10 Size = driver.find_element_by_id("su")
11 print(Size.size)
複製代碼

 12.多窗口之間的切換

場景:在頁面A點擊一個鏈接,會觸發在新Tab或者新窗口打開頁面B,因爲以前的driver實例對象在頁面A,可是你接下來的腳本是操做頁面B的元素,這樣就形成了找不到元素的報錯。原本介紹selenium中switch_to.window()方法來處理這個問題。

測試場景:打開百度新聞(頁面A),點擊熱點新聞中第一個新聞連接(通常是國家領導人的新聞),會在第二個窗口打開這個新聞的具體詳情頁(頁面B),測試須要去判斷你點擊這個這個新聞,在打開的詳情頁是否正確。

問題拆分:

1. 咱們已經知道switch_to.window()方法能夠處理窗口切換的問題

2. 在頁面A跳轉到頁面B以前,咱們須要用一個變量保存這個新聞的標題

3. 切換到頁面B後,咱們獲取這個新聞標題,而後和前面這個變量保存的值去對比,若是相等,那麼就測試經過。

咱們分兩個步驟去解答這個測試需求:

1. 先實現頁面A切換到頁面B

2. 頁面A和頁面B兩個新聞標題進行對比

先看看窗口切換的腳本代碼:

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox ()
 6 driver.maximize_window ()
 7 driver.get ('http://news.baidu.com')
 8 time.sleep (3)
 9 
10 driver.find_element_by_xpath ("//*[@id='pane-news']/div/ul/li[1]/strong/a").click ()
11 time.sleep (3)
12 print (driver.current_window_handle)  # 輸出當前窗口句柄
13 handles = driver.window_handles  # 獲取當前所有窗口句柄集合
14 print (handles)  # 輸出句柄集合
15 
16 for handle in handles:  # 切換窗口
17     print(handle)
18     if handle != driver.current_window_handle:
19         print(handle)
20         print ('switch to second window', handle)
21         driver.close ()  # 關閉第一個窗口
22         driver.switch_to.window (handle)  # 切換到第二個窗口
23         print(handle)
複製代碼

注:經過driver.current_window_handle獲取的當前窗口句柄,不管打開多少個窗口,只要不使用driver.switch_to.window()就是第一次打開的窗口。

使用driver.window_handles獲取的窗口爲當前打開的全部窗口。

只有driver.switch_to.window()才能切換到對應的窗口,獲取窗口句柄。

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 # driver = webdriver.Chrome()
 6 driver = webdriver.Firefox()
 7 # driver.maximize_window ()
 8 driver.get ('http://news.baidu.com')
 9 time.sleep (1)
10 
11 news_link = driver.find_element_by_xpath ("//*[@id='pane-news']/div/ul/li[1]/strong/a")
12 page1_title_string = news_link.text  # 獲得頁面A新聞標題
13 print(page1_title_string)
14 news_link.click ()  # 點擊新聞連接
15 time.sleep (1)
16 handles = driver.window_handles
17 
18 for handle in handles:  # 切換窗口(切換到搜狗)
19     if handle != driver.current_window_handle:
20         print( 'switch to second window', handle)
21         driver.close ()  # 關閉第一個窗口
22         driver.switch_to.window (handle)  # 切換到第二個窗口
23 page2_title_string = driver.find_element_by_xpath ("/html/body/div[2]/div[2]/div[4]/div[2]/div/div[1]").text
24 
25 print(page2_title_string)
26 # 詳情頁有一個原標題
27 
28 try:
29     assert page1_title_string in page2_title_string  # 判斷頁面B標題是否包含頁面A標題
30     print ('Test Pass.')
31 except Exception as e:
32     print ('Test Fail')
複製代碼

注:

1.通常編程的過程當中,要提早設置瀏覽器最大化,不要使用drive.maxisize_window()去設置窗口的大小。否者當瀏覽器窗口最大時,使用該方法瀏覽器就會變成最小,致使有些元素經過xpath定位失效。

2網頁的title與新聞詳情頁的title是不同的概念,前者經過driver.title便可獲取,後者經過元素定位獲取。

13.處理iframe切換

問題:發現元素定位沒問題,在測試回放的過程,發現就是找不到元素報錯。

因爲沒有找到合適的iframe網站,這裏很差用代碼舉例,簡單文字加圖片來介紹。

1 driver.switch_to.frame("iframe1")  
2 # 操做目標元素,這個目標元素在 iframe1裏面,這裏就是百度文本輸入框輸入文字  
3 driver.switch_to.default_content()

14.處理alert彈框

1 driver.switch_to_alert().accept()  # 點擊彈出裏面的肯定按鈕  
2 #driver.switch_to_alert().dismiss() # 點擊彈出上面的X按鈕

15.獲取當前頁面的所有圖片信息

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Chrome ()
 6 driver.maximize_window ()
 7 driver.implicitly_wait (6)
 8 driver.get ("http://news.baidu.com")
 9 time.sleep (1)
10 print(driver.find_elements_by_tag_name ("img"))
11 for image in driver.find_elements_by_tag_name ("img"):
12     print (image.text)
13     print (image.size)
14     print (image.tag_name)
複製代碼

 

 運行結果:

運行結果,發現沒有圖片名稱打印出來,說明百度新聞頁面,全部圖片都沒有給出text這個屬性,前端的妹子沒有寫圖片的text屬性

 16.獲取頁面元素的herf屬性

經過Selenium獲取頁面元素的某一個屬性。一個元素可能有多個屬性,例如 class, id, name, text, href, vale等等。這裏咱們舉例一個爬蟲中常常須要處理的連接問題:找出當前頁面全部的超連接。

已百度首頁爲例,打印全部包含href的元素的連接

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox()
 6 driver.maximize_window()
 7 # driver.implicitly_wait(6)
 8 driver.get("https://www.baidu.com")
 9 time.sleep(1)
10 print(driver.find_elements_by_xpath("//*[@href]"))
11 for link in driver.find_elements_by_xpath("//*[@href]"):
12     print(link)
13     print(link.get_attribute('href'))
14 driver.quit()
複製代碼

17.如何截圖並保存

複製代碼
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox()
 6 driver.maximize_window()
 7 
 8 driver.get("https://www.baidu.com")
 9 time.sleep(1)
10 
11 driver.get_screenshot_as_file("‪C:\\Users\\fyr\\Desktop\\新建文本文檔 11(2).png")
12 time.sleep(4)
13 driver.quit()
相關文章
相關標籤/搜索