1. 程式人生 > >python selenium 基礎框架

python selenium 基礎框架

for exce please etc form 文本框 不同 pos www

技術分享圖片

base_page.py

  1 # coding=utf-8
  2 import time
  3 from selenium.common.exceptions import NoSuchElementException
  4 import os.path
  5 from unittest3.framework.logger import Logger
  6 
  7 # create a logger instance
  8 logger = Logger(logger="BasePage").getlog()
  9 
 10 
 11 class BasePage(object):
12 """ 13 定義一個頁面基類,讓所有頁面都繼承這個類,封裝一些常用的頁面操作方法到這個類 14 """ 15 16 def __init__(self, driver): 17 self.driver = driver 18 19 # quit browser and end testing 20 21 def quit_browser(self): 22 self.driver.quit() 23 24 # 瀏覽器前進操作 25 26 def
forward(self): 27 self.driver.forward() 28 logger.info("Click forward on current page.") 29 30 # 瀏覽器後退操作 31 32 def back(self): 33 self.driver.back() 34 logger.info("Click back on current page.") 35 36 # 隱式等待 37 38 def wait(self, seconds):
39 self.driver.implicitly_wait(seconds) 40 logger.info("wait for %d seconds." % seconds) 41 42 # 點擊關閉當前窗口 43 44 def close(self): 45 try: 46 self.driver.close() 47 logger.info("Closing and quit the browser.") 48 except NameError as e: 49 logger.error("Failed to quit the browser with %s" % e) 50 51 # 保存圖片 52 53 def get_windows_img(self): 54 """ 55 在這裏我們把file_path這個參數寫死,直接保存到我們項目根目錄的一個文件夾.\Screenshots下 56 """ 57 file_path = os.path.dirname(os.path.abspath(.)) + /screenshots/ 58 rq = time.strftime(%Y%m%d%H%M, time.localtime(time.time())) 59 screen_name = file_path + rq + .png 60 try: 61 self.driver.get_screenshot_as_file(screen_name) 62 logger.info("Had take screenshot and save to folder : /screenshots") 63 except NameError as e: 64 logger.error("Failed to take screenshot! %s" % e) 65 self.get_windows_img() 66 67 # 定位元素方法 68 69 def find_element(self, selector): 70 """ 71 這個地方為什麽是根據=>來切割字符串,請看頁面裏定位元素的方法 72 submit_btn = "id=>su" 73 login_lnk = "xpath => //*[@id=‘u1‘]/a[7]" # 百度首頁登錄鏈接定位 74 如果采用等號,結果很多xpath表達式中包含一個=,這樣會造成切割不準確,影響元素定位 75 :param selector: 76 :return: element 77 """ 78 element = ‘‘ 79 if => not in selector: 80 return self.driver.find_element_by_id(selector) 81 selector_by = selector.split(=>)[0] 82 selector_value = selector.split(=>)[1] 83 84 if selector_by == "i" or selector_by == id: 85 try: 86 element = self.driver.find_element_by_id(selector_value) 87 logger.info("Had find the element \‘ %s \‘ successful " 88 "by %s via value: %s " % (element.text, selector_by, selector_value)) 89 except NoSuchElementException as e: 90 logger.error("NoSuchElementException: %s" % e) 91 self.get_windows_img() # take screenshot 92 elif selector_by == "n" or selector_by == name: 93 element = self.driver.find_element_by_name(selector_value) 94 elif selector_by == "c" or selector_by == class_name: 95 element = self.driver.find_element_by_class_name(selector_value) 96 elif selector_by == "l" or selector_by == link_text: 97 element = self.driver.find_element_by_link_text(selector_value) 98 elif selector_by == "p" or selector_by == partial_link_text: 99 element = self.driver.find_element_by_partial_link_text(selector_value) 100 elif selector_by == "t" or selector_by == tag_name: 101 element = self.driver.find_element_by_tag_name(selector_value) 102 elif selector_by == "x" or selector_by == xpath: 103 try: 104 element = self.driver.find_element_by_xpath(selector_value) 105 logger.info("Had find the element \‘ %s \‘ successful " 106 "by %s via value: %s " % (element.text, selector_by, selector_value)) 107 except NoSuchElementException as e: 108 logger.error("NoSuchElementException: %s" % e) 109 self.get_windows_img() 110 elif selector_by == "s" or selector_by == selector_selector: 111 element = self.driver.find_element_by_css_selector(selector_value) 112 else: 113 raise NameError("Please enter a valid type of targeting elements.") 114 115 return element 116 117 # 輸入 118 119 def type(self, selector, text): 120 121 el = self.find_element(selector) 122 el.clear() 123 try: 124 el.send_keys(text) 125 logger.info("Had type \‘ %s \‘ in inputBox" % text) 126 except NameError as e: 127 logger.error("Failed to type in input box with %s" % e) 128 self.get_windows_img() 129 130 # 清除文本框 131 132 def clear(self, selector): 133 134 el = self.find_element(selector) 135 try: 136 el.clear() 137 logger.info("Clear text in input box before typing.") 138 except NameError as e: 139 logger.error("Failed to clear in input box with %s" % e) 140 self.get_windows_img() 141 142 # 點擊元素 143 144 def click(self, selector): 145 146 el = self.find_element(selector) 147 try: 148 el.click() 149 logger.info("The element \‘ %s \‘ was clicked." % el.text) 150 except NameError as e: 151 logger.error("Failed to click the element with %s" % e) 152 153 # 或者網頁標題 154 155 def get_page_title(self): 156 logger.info("Current page title is %s" % self.driver.title) 157 return self.driver.title 158 159 @staticmethod 160 def sleep(seconds): 161 time.sleep(seconds) 162 logger.info("Sleep for %d seconds" % seconds)

browser_engine.py

 1 # coding=utf-8
 2 from selenium import webdriver
 3 
 4 
 5 class BrowserEngine(object):
 6     """
 7     定義一個瀏覽器引擎類,根據browser_type的值去,控制啟動不同的瀏覽器,這裏主要是IE,Firefox, Chrome
 8 
 9     """
10 
11     def __init__(self, driver):
12         self.driver = driver
13 
14     browser_type = "Chrome"  # maybe Firefox, Chrome, IE
15 
16     def get_browser(self):
17         """
18         通過if語句,來控制初始化不同瀏覽器的啟動,默認是啟動Chrome
19         :return: driver
20         """
21 
22         if self.browser_type == Firefox:
23             driver = webdriver.Firefox()
24         elif self.browser_type == Chrome:
25             driver = webdriver.Chrome()
26         elif self.browser_type == IE:
27             driver = webdriver.Ie()
28         else:
29             driver = webdriver.Chrome()
30 
31         # driver.maximize_window()
32         driver.implicitly_wait(10)
33         driver.get("https://www.baidu.com")
34         return driver

logger.py

 1 # _*_ coding: utf-8 _*_
 2 import logging
 3 import os.path
 4 import time
 5 
 6 
 7 class Logger(object):
 8     def __init__(self, logger):
 9         """
10         指定保存日誌的文件路徑,日誌級別,以及調用文件
11             將日誌存入到指定的文件中
12         :param logger:
13         """
14         # 創建一個logger
15         self.logger = logging.getLogger(logger)
16         self.logger.setLevel(logging.DEBUG)
17 
18         # 創建一個handler,用於寫入日誌文件
19         rq = time.strftime(%Y%m%d%H%M, time.localtime(time.time()))
20         log_path = os.path.dirname(os.getcwd()) + /Logs/
21         log_name = log_path + rq + .log
22         fh = logging.FileHandler(log_name)
23         fh.setLevel(logging.INFO)
24 
25         # 再創建一個handler,用於輸出到控制臺
26         ch = logging.StreamHandler()
27         ch.setLevel(logging.INFO)
28 
29         # 定義handler的輸出格式
30         formatter = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
31         fh.setFormatter(formatter)
32         ch.setFormatter(formatter)
33 
34         # 給logger添加handler
35         self.logger.addHandler(fh)
36         self.logger.addHandler(ch)
37 
38     def getlog(self):
39         return self.logger

baidu_homepage.py

# coding=utf-8
from unittest3.framework.base_page import BasePage


class HomePage(BasePage):
    input_box = "id=>kw"
    search_submit_btn = "xpath=>//*[@id=‘su‘]"

    def type_search(self, text):
        self.type(self.input_box, text)

    def send_submit_btn(self):
        self.click(self.search_submit_btn)

測試類代碼 baidu_search.py

# coding=utf-8
import time
import unittest
from selenium import  webdriver
from unittest3.page_object.baidu_homepage import HomePage
from unittest3.framework.browser_engine import BrowserEngine

class BaiduSearch(unittest.TestCase):
    def setUp(self):
        """
        測試固件的setUp()的代碼,主要是測試的前提準備工作
        :return:
        """
        # 添加如下代碼,可運行
        # -------------------------------------------
        # browse = BrowserEngine(self)
        # self.driver = webdriver.Firefox()
        # self.driver.get(‘https://www.baidu.com‘)
        #-------------------------------------------
        # 修改代碼可以執行
        browse = BrowserEngine(self)
        self.driver=browse.get_browser()


    def tearDown(self):
        """
        測試結束後的操作,這裏基本上都是關閉瀏覽器
        :return:
        """
        self.driver.quit()

    def test_baidu_search(self):
        """
        這裏一定要test開頭,把測試邏輯代碼封裝到一個test開頭的方法裏。
        :return:
        """
        homepage = HomePage(self.driver)
        homepage.type_search(selenium)  # 調用頁面對象中的方法
        homepage.send_submit_btn()  # 調用頁面對象類中的點擊搜索按鈕方法
        time.sleep(2)
        homepage.get_windows_img()  # 調用基類截圖方法
        try:
            assert selenium in homepage.get_page_title()  # 調用頁面對象繼承基類中的獲取頁面標題方法
            print(Test Pass.)
        except Exception as e:
            print(Test Fail., format(e))


if __name__ == __main__:
    unittest.main()

python selenium 基礎框架