1.selenium定位方式,條件:必須是惟一的,若是不知道怎麼寫,能夠右鍵copy xpath ,這樣就會copy出一個 xpath形式的定位代碼css
find_element_by_id('kw')html
find_element_by_name()web
find_element_by_class_name()django
find_element_by_tag_name()框架
find_element_by_link_text()less
find_element_by_partial_link_text()函數
find_element_by_xpath()單元測試
find_element_by_css_selector()測試
2. 經過xpath定位方式:ui
find_element_by_xpath("//*[@id='kw' ") 或者find_element_by_xpath("//input[@id='kw' ") #兩個//表示某一個標籤,*表示任意標籤名, 等同於 find_element_by_id('kw')
find_element_by_xpath("//input[@name='wd' ") #兩個//表示某一個標籤,*表示任意標籤名, 等同於 find_element_by_name('wd')
find_element_by_xpath("//input[@class='s_ipt' ")
find_element_by_xpath("//a[text(), '新聞']") #等同於find_element_by_link_text('新聞'), partial_link_text:能夠用 find_element_by_xpath("//a[contains(@name, 'hao123')]")
find_element_by_xpath("//input[@autocomplete='off' ")
find_element_by_xpath("//form/span[@class='aaa']/input[2]")
find_element_by_xpath("/html/body/div/div[2]/")
find_element_by_xpath("//form[@id='form' and name='f' and class='fm']/span[2]/input[2]")
3. css_selector定位方式:
find_element_by_css_selector("#kw") # 等於id
find_element_by_css_selector("[name='wd']")
find_element_by_css_selector(".s_ipt") # . 等於class
find_element_by_css_selector("span.s_ipt >input >") # >表示層級關係
4. selenium定位的時候,如百度首頁的設置,這種是須要鼠標懸停的,能夠用 ActionChains 方法(from selenium.webdriver.common.action_chains import ActionChains), 下拉列表能夠用Select方法(from selenium.webdriver.support.select import Select), 當點保存後會有一個提示框(警告框等),能夠用Alert(from selenium.webdriver.common.alert import Alert), 語法以下:
setting=dr.find_element_by_link_text("設置")
ActionChains(dr).move_to_element(setting).perform()
selectitem=dr.find_element_by_id("nr")
Select(selectitem).select_by_value('20')
alert=dr.switch_to_alert()
print(alert.text)
alert.accept()
5. 若是定位的時候感受對可是怎麼也定位不到,須要研究一下是否是有嵌套表單,如https://mail.qq.com, 須要多表單的切換:
dr.switch_to_frame('login_frame') # switch_to_frame('') 這裏能夠是id也能夠是name
若是點擊後彈出一個新的窗口,這時須要切換窗口,涉及到句柄handle:switch_to_window(),具體用法以下:
handle=dr.current_window_handle #獲取當前的窗口句柄
handles=dr.window_handles #獲取全部的窗口句柄
for handle in handles:
if handle!=handle1:
dr.switch_to_window(handle)
dr.find_element_by_id('nickname').send_keys("aaa")
dr.close() #關掉一個窗口
6. 幾個方法:set_window_size(400,600), getattribute(type), is_displayed()
7. 幾種等待方法:
顯式等待:from selenium.webdriver.support import expected_conditions as EC
element=WebDriverWait(driver, 5, 0.5).until (
EC.presence_of_element_located((By.ID, 'kw'))
)
隱式等待:只須要加一行:dr.implicitly_wait(5)在程序的開頭
8.單元測試框架(unittest, pytest), web開發框架(django, falsk)
9. 驗證碼怎麼破?
10. 怎麼樣讀取csv文件:
import csv
datas=csv.reader(open('./testData/user_info.csv', 'r'))
for data in datas:
if data[0]=='username':
continue
print(data[0])
print(data[1])
11.怎麼樣讀取txt文件:
f=open('./testData/user_info.txt','r')
info=f.readlines()
f.close()
for i in range(0,2):
a=info[i].split(';')
username=a[0]
password=a[1]
b=Login(dr)
b.login126(username,password)
12. 怎麼樣讀取xml文件:
13.unittest 特色:
a. 建立的類必須繼續unittest.TestCase
b. 建立的方法必須以test開頭
c. 斷言方法爲self.assertEqual(result, 8)
d. 執行測試在if __name__=='__main__'裏用unittest.main()
e. setUp(self), tearDown(self)方法來執行每一條測試的開始要作的和最後要作的操做
f. 測試套件:suit=unittest.TestSuite() suit.addTest(類名(‘方法名'))
g.測試運行器:runner=unittest.TextTestRunner() runner.run(suit)
h.discover方法:能夠指定哪些文件來執行, suit=unittest.defaultTestLoader.discover("start_dir='xxx', pattern='test*.py')
i. 能夠用一些裝飾器,好比@unittest.skip("skip') @unittest.skipIf(3>2, 'if true skip') @unittest.skipUnless(3>2, 'if true執行'), @unittest.unexpectedFailure
j. fixture 除了每條case的setUp, tearDown,還有類和module的setUpClass(cls), tearDownClass(cls),setUpModule(), tearDownModule() 方法前須要用@classmethon來裝飾
14. pytest:
pytest
will run all files of the form test_*.py or *_test.py in the current directory and its subdirectories. More generally, it follows standard test discovery rules.