selenium案例

#coding=utf-8 #select下拉框處理 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time #導入select方法 from selenium.webdriver.support.select import Select driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #隱式等待10秒 driver.implicitly_wait(10) #鼠標移動到"設置"按鈕 mouse=driver.find_element_by_link_text("設置") ActionChains(driver).move_to_element(mouse).perform() #點擊"搜索設置" driver.find_element_by_link_text("搜索設置").click() #強制等待4秒,注意:這里使用隱式等待或顯式等待都將無法獲取元素 time.sleep(4) #分兩步,先定位下拉框,再點擊選項 choice = driver.find_element_by_name("NR") Select(choice).select_by_index(2) time.sleep(2) driver.find_element_by_xpath("//div[@id='gxszButton']/a[1]").click() time.sleep(2) driver.switch_to.alert.accept() #跳轉到百度首頁后,進行搜索表 driver.find_element_by_id('kw').send_keys("python") driver.find_element_by_id('su').click()
cookie登陸(百度)

#coding=utf8 from selenium import webdriver import time import pprint base_url = "https://www.baidu.com" driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get(base_url) #打印所有cookie pprint.pprint(driver.get_cookies())

#coding=utf-8 from selenium import webdriver import time import pprint base_url = "https://www.baidu.com" usr_name = "正牌冰峰汽水" usr_pwd = "yanyan8174" driver = webdriver.Chrome() driver.implicitly_wait(10) #清除所有cookie driver.delete_all_cookies() driver.get(base_url) pprint.pprint(driver.get_cookies()) driver.find_element_by_link_text("登錄").click() time.sleep(2) driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() time.sleep(2) driver.find_element_by_css_selector("#TANGRAM__PSP_10__userName").send_keys(usr_name) driver.find_element_by_css_selector("#TANGRAM__PSP_10__password").send_keys(usr_pwd) time.sleep(10) #在這個等待的時間里去手動輸入驗證碼 driver.find_element_by_css_selector("#TANGRAM__PSP_10__submit").click() time.sleep(3) #打印登錄后的cookie pprint.pprint(driver.get_cookies())

#coding=utf-8 from selenium import webdriver import time base_url = "https://www.baidu.com" driver = webdriver.Chrome() driver.implicitly_wait(10) #清除所有cookie driver.delete_all_cookies() driver.get(base_url) cookie_1 = {'httpOnly': True, 'secure': False, 'value': '1', 'name': 'HOSUPPORT', 'domain': '.passport.baidu.com', 'path': '/', 'expiry': 1768236049.395134 } cookie_2 = {'httpOnly': True, 'secure': False, 'value': 'fi_PncwhpxZ%7ETaKAcaFAwWer%7EzluYq4tLyhh8G8D-51Jh32rZKfPIAaPUksyRGhrJ-ndBYw3t-vNiNSFW6D', 'name': 'UBI', 'domain': '.passport.baidu.com', 'path': '/', 'expiry': 1768236050.02163} cookie_3 = {'httpOnly': False, 'secure': False, 'value': 'f39184d315d7eacfb7b1f37fc37f5e72', 'name': 'FP_UID', 'domain': '.baidu.com', 'path': '/', 'expiry': 2556057600} #測試后發現就添加這個cookie即可 cookie_4 = {} #添加cookie driver.add_cookie(cookie_4) #driver.add_cookie(cookie_2) #driver.add_cookie(cookie_3) time.sleep(2) driver.refresh()
cookie登陸+手動輸入驗證碼

#coding=utf-8 from selenium import webdriver import time import pprint base_url = "http://www.xx007.cn/login.asp" usr_name = "benq81" usr_pwd = "jenny8174" driver = webdriver.Chrome() driver.implicitly_wait(10) #清除所有cookie driver.delete_all_cookies() driver.get(base_url) pprint.pprint(driver.get_cookies()) driver.refresh() driver.find_element_by_name("username").send_keys(usr_name) driver.find_element_by_name("password").send_keys(usr_pwd) time.sleep(10) #在這個等待的時間里去手動輸入驗證碼 driver.find_element_by_css_selector('body > table:nth-child(12) > tbody > tr:nth-child(12) > td > input[type="submit"]').click() time.sleep(2) #打印登錄后的cookie pprint.pprint(driver.get_cookies())

#coding=utf-8 from selenium import webdriver import time import pprint base_url = "http://www.xx007.cn/" driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get(base_url) pprint.pprint(driver.get_cookies()) cookie01=driver.get_cookie('DvForum') cookie01_value=cookie01['value'].split("=")[-1] print(cookie01_value) cookie01={'domain': 'www.xx007.cn', 'expiry': 1511971.2069744722, 'httpOnly': False, 'name': 'DvForum', 'path': '/', 'secure': False, 'value': 'userid=555232&usercookies=2&userhidden=2&password=CgWJBnM9970wE057&userclass=%B4%BF%C2%F2%BC%D2%BB%E1%D4%B1&username=benq81&StatUserID=368139236' } cookie02={'domain': 'www.xx007.cn', 'httpOnly': False, 'name': 'upNum', 'path': '/', 'secure': False, 'value': '0'} cookie03={'domain': 'www.xx007.cn', 'httpOnly': False, 'name': 'ASPSESSIONIDSATQDDSQ', 'path': '/', 'secure': False, 'value': 'IHDFJPPALBLMOJLCHCHHBFKD'} driver.delete_all_cookies() time.sleep(2) driver.add_cookie(cookie01) driver.add_cookie(cookie02) driver.add_cookie(cookie03) #打印登錄后的cookie time.sleep(4) driver.refresh()
使用unittest框架編寫測試用例

# coding=utf-8 ''' Project:基礎類BasePage,封裝所有頁面公用的方法, 定義open函數,重定義find_element,switch_frame,send_keys等函數。 在初始化方法中定義驅動driver,基本url,title WebDriverWait提供了顯式等待方式。 ''' from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BasePage(object): """ BasePage封裝所有頁面都公用的方法,例如driver, url ,FindElement等 """ #初始化driver、url、pagetitle等 #實例化BasePage類時,最先執行的就是__init__方法,該方法的入參,其實就是BasePage類的入參。 def __init__(self, selenium_driver, base_url, pagetitle): self.driver = selenium_driver self.base_url = base_url self.pagetitle = pagetitle #通過title斷言進入的頁面是否正確。 #使用title獲取當前窗口title,檢查輸入的title是否在當前title中,返回比較結果(True 或 False) def on_page(self, pagetitle): return pagetitle in self.driver.title #打開頁面,並校驗頁面鏈接是否加載正確 #以單下划線_開頭的方法,在使用import *時,該方法不會被導入,保證該方法為類私有的。 def _open(self, url, pagetitle): #使用get打開訪問鏈接地址 self.driver.get(url) self.driver.maximize_window() #使用assert進行校驗,打開的窗口title是否與配置的title一致。調用on_page()方法 assert self.on_page(pagetitle), "打開開頁面失敗 %s"%url #定義open方法,調用_open()進行打開鏈接 def open(self): self._open(self.base_url, self.pagetitle) #重寫元素定位方法 def find_element(self,*loc): try: #確保元素是可見的。 #注意:以下入參為元組的元素,需要加*。Python存在這種特性,就是將入參放在元組里。 #WebDriverWait(self.driver,10).until(lambda driver: driver.find_element(*loc).is_displayed()) #注意:以下入參本身是元組,不需要加* WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc)) return self.driver.find_element(*loc) except: print("%s 頁面中未能找到 %s 元素"%(self, loc)) #重寫switch_frame方法 def switch_frame(self, loc): return self.driver.switch_to.frame(loc) #定義script方法,用於執行js腳本,范圍執行結果 def script(self, src): self.driver.execute_script(src) #重寫定義send_keys方法 def send_keys(self, loc, vaule, clear_first=True, click_first=True): try: print("使用send_keys") loc = getattr(self,"_%s"% loc) #getattr相當於實現self.loc if click_first: self.find_element(*loc).click() if clear_first: self.find_element(*loc).clear() self.find_element(*loc).send_keys(vaule) except AttributeError: print ("%s 頁面中未能找到 %s 元素"%(self, loc))

# coding=utf-8 ''' Project:頁面基本操作方法:如open,input_username,input_password,click_submit ''' from selenium.webdriver.common.by import By from test_basePage import BasePage #繼承BasePage類 class LoginPage(BasePage): #定位器,通過元素屬性定位元素對象 username_loc =(By.NAME,'email') password_loc =(By.NAME,'password') submit_loc =(By.ID,'dologin') span_loc =(By.CSS_SELECTOR,"div.error-tt>p") dynpw_loc =(By.ID,"lbDynPw") userid_loc =(By.ID,"spnUid") #操作 #通過繼承覆蓋(Overriding)方法:如果子類和父類的方法名相同,優先用子類自己的方法。 #打開網頁 def open(self): #調用page中的_open打開連接 self._open(self.base_url, self.pagetitle) #輸入用戶名:調用send_keys對象,輸入用戶名 def input_username(self, username): self.find_element(*self.username_loc).send_keys(username) #輸入密碼:調用send_keys對象,輸入密碼 def input_password(self, password): self.find_element(*self.password_loc).send_keys(password) #點擊登錄:調用click對象,點擊登錄 def click_submit(self): self.find_element(*self.submit_loc).click() #用戶名或密碼不合理是Tip框內容展示 def show_span(self): return self.find_element(*self.span_loc).text #切換登錄模式為動態密碼登錄(IE下有效) def swich_DynPw(self): self.find_element(*self.dynpw_loc).click() #登錄成功頁面中的用戶ID查找 def show_userid(self): return self.find_element(*self.userid_loc).text

# coding=utf-8 ''' Project:頁面基本操作方法:如open,input_username,input_password,click_submit ''' from selenium.webdriver.common.by import By from test_basePage import BasePage #繼承BasePage類 class LoginPage(BasePage): #定位器,通過元素屬性定位元素對象 username_loc =(By.NAME,'email') password_loc =(By.NAME,'password') submit_loc =(By.ID,'dologin') error_loc =(By.XPATH,"//div[@class='ferrorhead']") userid_loc=(By.ID,"spnUid") frame_loc="x-URS-iframe" #操作 #通過繼承覆蓋(Overriding)方法:如果子類和父類的方法名相同,優先用子類自己的方法。 #輸入用戶名:調用send_keys對象,輸入用戶名 def input_username(self, username): self.find_element(*self.username_loc).send_keys(username) #輸入密碼:調用send_keys對象,輸入密碼 def input_password(self, password): self.find_element(*self.password_loc).send_keys(password) #點擊登錄:調用click對象,點擊登錄 def click_submit(self): self.find_element(*self.submit_loc).click() #切換到用戶登錄框的iframe中 def switch_to_frame(self): self.switch_frame(self.frame_loc) #用戶名或密碼不合理是Tip框內容展示 def show_error(self): try: WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(self.error_loc)) return self.find_element(*self.error_loc).text except: return False #切換登錄模式為動態密碼登錄(IE下有效) def swich_DynPw(self): self.find_element(*self.dynpw_loc).click() #登錄成功后獲取當前窗口的title def check_current_title(self): return self.driver.title #登錄成功頁面中的用戶ID查找 def show_userid(self): return self.find_element(*self.userid_loc).text

# -*- coding:utf8 -*- ''' Project:使用unittest框架編寫測試用例。 ''' import unittest,time from test_126_loginPage import LoginPage from selenium import webdriver class Caselogin126mail(unittest.TestCase): """ 登錄126郵箱的case """ def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.url ="http://www.126.com" self.username ="zhpmiss@126.com" self.password ="zhou0829miss@" #用例執行體 def test_login_mail(self): #聲明LoginPage類對象 login_page = LoginPage(self.driver, self.url, "網易") #調用打開頁面組件 login_page.open() #切換到登錄框Frame time.sleep(4) login_page.switch_to_frame() #調用用戶名輸入組件 login_page.input_username(self.username) #調用密碼輸入組件 login_page.input_password(self.password) #調用點擊登錄按鈕組件 login_page.click_submit() if login_page.show_error(): print("測試帳號密碼有誤的情況下是否彈出提示框:") self.assertEqual(login_page.show_error(),"帳號或密碼錯誤") else: print("測試帳號密碼正確的情況下是否進入確定頁面:") self.assertEqual(login_page.show_userid(),'zhpmiss@126.com') def tearDown(self): print("測試完畢") #self.driver.quit() if __name__ == "__main__": unittest.main()
完整案例:1、今日頭條

from selenium import webdriver from lxml import etree from pyquery import PyQuery as pq import time driver = webdriver.Chrome() #實例化 driver.maximize_window() #窗口最大化 driver.get('https://www.toutiao.com/') driver.implicitly_wait(10) #隱性等待10s【必須有,多加幾個】 driver.find_element_by_link_text('科技').click() driver.implicitly_wait(10) #隱性等待10s for i in range(3): js = "var q = document.documentElement.scrollTop="+str(i*500) driver.execute_script(js) time.sleep(2) time.sleep(5) page = driver.page_source doc = pq(page) #用pyquery實例化一下 doc = etree.HTML(str(doc)) contents = doc.xpath('//div[@class="wcommonFeed"]/ul/li') print(contents) #這是一個對象 print("--------------------------") for x in contents: title = x.xpath('div/div[1]/div/div[1]/a/text()') if title: title = title[0] # with open('toutiao.txt','a+',encoding='utf8')as f: # f.write(title+'\n') print(title) else: pass
