selenium+python面試題目總結

1. WebDriver原理css

webDriver是按照client/server模式設計,client就是咱們的測試代碼,發送請求,server就是打開的瀏覽器來打開client發出的請求並作出響應。html

具體的工做流程:java

·webdriver打開瀏覽器並綁定到指定端口。啓動的瀏覽器做爲remote server.node

·client經過commandExecuter發送httpRequest給remote server的的偵聽端口(the      webdriver wire control通訊協議)python

·Remote server根據原生的瀏覽器組件來轉化爲瀏覽器的native調用。linux

備註:啓動瀏覽器的時候,使用的是http: hyper test transfer protocolweb

 

2. Selenium 特色和組成ajax

Selenium是一個針對web應用的開源測試框架,它的測試用例能夠用html table或者html 代碼或者編程語言進行開發,並且他能在幾乎全部的如今的瀏覽器上執行。Selenium能夠被部署到windows.linux.mac平臺上,支持的語言有java/python/ruby/.net/perl編程

特色:windows

·支持錄製回放

·多種方式對頁面元素進行定位並操做

·可以及進行debug和設置斷點

·可以把測試腳本保存成html/ruby或者其餘語言

·支持user-extensions.js形式的用戶擴展

·可以進行頁面的斷言

1) Selenium IDE: 是firefox的插件,能夠錄製/回放/測試腳本

2) Selenium RC:支持程序語言(java/C#/python/ruby)編寫測試用例; selenium和其餘測試框架集成,好比java環境下將selenium和Junit集成,利用selenium來書寫測試用例,用Junit來實現測試用例的自動化運行。

3) Selenium Core:是selenium的核心,是有js和html文件組成,它是selenium IDE和selenium RC的核心引擎。

4) Selenium Grid:是selenium的擴展,能夠將一批selenium腳本分配到不一樣的測試機上同步運行。即selenium grid能夠在不一樣的主機上創建主節點(hub)和分支節點(node), 可使主節點上的測試用例在不一樣的分支節點上運行。對於不一樣的節點來講,能夠搭建不一樣的測試環境(操做系統/瀏覽器)。

 

3. Selenium內部運行機制

 

4. 如何提升自動化腳本穩定性

找緣由

1)網速緣由,增長時間等待

2)函數緣由,儘可能少使用容易衝突的函數

3)配置testNG實現多線程,在編寫測試用例的時候,必定要實現鬆耦合,在服務器容許的狀況下儘可能設置多線程運行,提升執行速度。

 

5. 高質量自動化腳本特色

業務和代碼分離,封裝型好。

自動化用例耦合性低,獨立性強,易於擴展維護

 

6. 自動化測試缺陷

不穩定

可靠性不強

不易維護

成本與收益

 

7. 自動化用例的執行策略

根據自動化執行的目的來決定

(1)自動化測試用例執行用來監控,能夠設置用例定時執行;

(2)用於迴歸測試,能夠把測試用例設置成觸發式執行;

(3)不須要常常執行的測試用例,能夠由人工執行。

 

8. 提升selenium腳本的執行速度方式

1)減小操做步驟,減小沒必要要的操做;

2)中斷頁面加載,若是頁面加載內容過多而且加載的內容不影響咱們測試,能夠設置超時時間,中斷頁面加載;

3)設置等待時間的時候,能夠sleep()固定的時間,檢測到元素出現後中斷等待也能夠提升速度;

4) 配置testNG實現多線程,在編寫測試用例的時候,必定要實現鬆耦合,在服務器容許的狀況下儘可能設置多線程運行,提升執行速度。

 

9. 元素定位

1) Id定位

find_element_by_id(‘kw’)   //經過id屬性定位

2) Name定位

find_element_by_name(‘wd’)    //經過名字進行定位,名字通常不惟一,通常不能        通    過其定位

3) ClassName定位

find_element_by_class_name(‘cn’)   //經過類名進行定位

4) TagName定位

find_element_by_tag_name(‘input’)  //標籤,通常用於一類元素的定位

5) LinkText定位

find_element_by_link_text(‘新聞’)  //文本連接定位

6) PartialLinkText定位

find_element_by_partial_link_text(‘一個很長的’) //文本連接的部分文字

7) 絕對路徑定位

   find_element_by_xpath(‘/html/body/div/div[2]/form/span/input[2]’) //絕對地址定位,                 利用層級定位

   find_element_by_xpath(‘//input[@name=’n’ and id=’kw’]’) //當前頁面某個目錄下                         name爲n,id爲kw的input標籤,利用元素屬性進行定位

   find_element_by_xpath(‘//*[@id=kw]’) //其中*表示任何屬性,表示id爲kw的任何屬                 性的元素

   find_element_by_xpath(‘//span[@class=’c’]/input’) //層級和屬性結合進行定位

   find_element_by_xpath(‘//a[contains(href , ’test’)]’)

8) 相對路徑定位

相對路徑定位通常比絕對路徑定位快。

       find_element_by_css_selector(‘.class1’) // 類名定位 .class

   find_element_by_css_selector(‘#id’) //id定位 #id

   find_element_by_css_selector(‘input’) // 標籤名定位

   find_element_by_css_selector(‘[autocomplete=off]’) //屬性定位

   find_element_by_css_selector(‘span>input’) //標籤名爲span的input子元素

9) 定位一組元素

Checkboxes = find_elements_by_tag_name(‘checkbox’)

for checkbox in Checkboxes:

checkbox.click()  # 經過for循環全選全部的checkbox

Checkboxes.pop().click()  #取消勾選一些checkbox,pop(-1)=pop()表示一組元素的最後一個;pop(0)      表示一組元素的第一個,pop(1)表示一組元素的第二個,以此類推

10) 父子/兄弟/相鄰節點的定位

·父->子

Find_element_by_id(‘parent’).find_element_by_tag_name(‘input’) 串聯尋找

Find_element_by_xpath(‘//input/div[@name=’n’]/span/input[1]’)  xpath的層級

Find_element_by_css_selector(‘div#b>input’) css selector的父子關係

·子->父

Find_element_by_xpath(‘//div[@id=’c’]/../..’) 其中//div[@id=’c’]的父親的父親

·哥哥->弟弟

Find_element_by_xpath(‘//div[@id=’c’’/../div[1]) 找到弟弟後找父親而後找哥哥

Find_element_by_css_selector(‘div#d+div’) 表示id=d的div後面緊跟着的div

Find_element_by_css_selector(‘div#d~div’) 表示id=d的div後面同一級全部div

11) 二次定位

Element1 = driver.find_element_by_id(‘ID1’)

Element2 = Element1.find_element_by_id(‘ID2’)

12) display: none 和hidden的區別

共同點:把網頁中的某個元素隱藏起來;他們在selenium中都是定位不到的。

區別:display:none不爲隱藏的對象保留其物理空間,該對象在這個頁面上完全消失,看不到/摸不到;hidden使對象在網頁上不可見,但該對象在網頁中依然佔有空間,看不到/摸獲得。

備註:isElementPresent()來判斷元素是否存在。

 

10. 常見控件使用

1) link/button:

element.click()

注:ajax不能使用clickAndWait()函數,由於cickAndWait函數會在click以後等待頁面從新加載完成,而ajax是部分刷新,因此這個頁面不能從新加載完成。

2) Textbox:

element.send_keys(‘test’)

 

3) Upload

Driver.find_element_by_id(‘id’).send_keys(‘D\test.txt’)

 

4) Mouse Event:

e1=driver.find_element_by_id(‘kw’)

ActionChains(driver).double_click()/.context_click()/.drag_and_drop()/.move_to_eleme        nt()/.perform()   # 雙擊/右擊/拖動/懸停/執行actionChains中的行爲

 

5) Dropdown:

·<Select>標籤的下拉菜單

from selenium.webdriver.support.ui import Select

Select(driver.find_element_by_id(‘gender’)).select_by_index(1)

Select(driver.find_element_by_id(‘gender’)).select_by_value(「2」)

Select(driver.find_element_by_id(‘gender’)).select_by_visible_text(「Male」)

·非<Select>標籤的下拉菜單

Dropdown1 = driver.find_element_by_id(‘id’) #先定位到dropdown

Dropdown1.find_element_by_id(「li2_input_2」) #再定位到dropdown中的值

 

6) Alert:

driver.switch_to.alert.accept()//接受

driver.switch_to.alert.dismiss() //取消

Message=driver.switch_to.alert.text  //獲取彈窗的文本消息

driver.switch_to.alert.send_keys(‘hello’) //輸入值,這個在alert和confirm中不可用

 

7) Window

Driver.refresh() 刷新

Driver.back() 後退

Driver.forward() 前進

Driver.maximize_window() 最大化

Driver.set_window_size(100,200) 設置窗口大小

Driver.switch_to.window(searchwindow)

 

8) Frame

Driver.switch_to.frame(ReferenceFrame)

Driver.switch_to.parent_frame()  # frame須要一級一級切

Driver.switch_to.default_content()

 

11. 等待

1) 顯式等待

等待某個條件成立時繼續執行,每隔一段時間進行檢測,超出最大時間    則拋出異常(程序每隔X秒看一眼,若是條件成立,執行下一步,不然等待,超出最大    時間,拋出異常)

From selenium.webdriver.common.by import By

From selelnium.webdirver.support.ui import WebDriverWait

From selenium.webdriver.support import expected_conditions as EC

E = WebDriverWait(driver, 5,0.5).until(

EC.presence_of_element_located( (By.ID, ‘kw’) )

)

2) 隱式等待

隱式等待中的時間並不是一個固定的等待時間,它並不影響腳本的執行速度。好比進行某元素的定位時,若是元素能夠定位就繼續執行,若是目前定位不到就以輪詢的方式持續判斷該元素是否被定位到,若是超過規定的時間還沒定位到就拋出異常。(甲約乙去吃飯,甲在這裏等着,等了10分鐘乙到達,則從10分鐘以後開始下一步,假如等了20分鐘,則20分鐘後開始下一步,若是到了最大時間30分鐘還沒到就拋異常)

driver.implicitly_wait(20)

3) 強制等待

From time import sleep

Sleep(2)

12. 截圖

driver.get_screenshot_as_file('E:\sc.jpg')

13. 線性測試

開發維護成本高

14. 模塊化驅動測試

將重複的操做獨立爲公共模塊,儘可能消除重複,提升測試用例的可維護性。

15. 數據驅動測試

數據參數化

1) 讀取txt文件

File= open(‘E:\wtest.txt’, ‘r’)

Lines = File.readlines()

For line in lines:

User = line.split(‘,’)[0]

Passw=line.split(‘,’)[1]

Print(User, Passw)

2) 讀取csv文件

UnicodeDecodeError (未找到解決方案)

3) 讀取xml文件

 

16. 關鍵字驅動測試

腳本/數據/業務 分離

 

17. page object設計模式

是將page對象封裝成一個HTML頁面,經過提供的應用程序特定的API來操做頁面元素,而不是在html中來搜尋對象,即提供一個易於編程的接口並隱藏窗口中底層的部件,對界面的交互細節進行封裝。

優勢是:減小了代碼的重複/提升測試用例的可讀性/提升測試用例的可維護性(特別是UI頻繁變化的項目)

page object設置模式中,不須要在page裏定位的方法中加上斷言(why)

 

18. Assert斷言

-斷言的英文是assertion,斷言檢查的英文是assertion checking。

-斷言是指定一個程序必須已經存在的狀態的一個邏輯表達式,或者一組程序變量在程序執行期間的某個點上必須知足的條件。

Assert判斷若是出現錯誤,則會中斷整個測試;使用verify進行判斷若是出現錯誤仍會繼續執行直到結束。

 

19. Dsfdsadsaf

20. Dsaf倒數

相關文章
相關標籤/搜索