Python_selenium案例:


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()
selenium打開網頁+懸浮+點擊+進入百度頁面+輸入關鍵詞+搜索

 

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())
1.拿到未登錄的cookie
#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())
2.正常登陸拿到登陸后的cookie
#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()
3.模擬登陸

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())
1.拿到未登錄的cookie+手動輸入驗證碼
#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()
2.模擬登陸

 

使用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))
test_pagePage.py
# 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
test_loginPage
# 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
tets_126_loginPage.py
# -*- 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()
test_126.py

 

完整案例: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
抓取今日頭條——科技 內容title
selenium抓取今日頭條,滾動向下拿50頁,保存到文本文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM