到目前为止 项目的结构如下
base_page的封装
import time from selenium.common.exceptions import NoSuchElementException import os.path from framework.logger import Logger from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver #创建一个日志 logger = Logger(loggername="BasePage").getlog() class BasePage(object): ''' 定义一个页面基类,让所有页面都继承这个类,封装一些常用的页面操作方法到这个类比如find_element 显示等待 ''' def __init__(self,driver): self.driver = driver def quit_browser(self): self.driver.quit() def forward(self): logger.info("前进") self.driver.forward() def back(self): logger.info("后退") self.driver.back() #显式等待 def wait(self,locator): #显式等待 logger.info("显式等待") WebDriverWait(self.driver,timeout=20,poll_frequency=0.5).until(EC.presence_of_element_located(locator)) def close_current_window(self): try: self.driver.close() except NameError as e: logger.error("Failed to quit the broswer with %s"% e) #保存截图 def get_sreenshot(self,screenName): file_path = os.path.dirname(os.path.abspath("."))+"/screenshots/" timestamps = time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))#获取当前时间的时间戳 screen_name = file_path+timestamps+screenName+".png" try: self.driver.get_screenshot_as_file(screen_name) logger.info("Had take screenshot and save to folder :/screenshots") except NameError as e: logger.error("Failed to take screeshot") self.get_sreenshot() def find_element(self, selector): """ 这个地方为什么是根据=>来切割字符串,请看页面里定位元素的方法 submit_btn = "id=>su" login_lnk = "xpath => //*[@id='u1']/a[7]" # 百度首页登录链接定位 如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位 :param selector: :return: element """ element = '' if '=>' not in selector: return self.driver.find_element_by_id(selector) selector_by = selector.split('=>')[0] selector_value = selector.split('=>')[1] if selector_by == "i" or selector_by == 'id': try: element = self.driver.find_element_by_id(selector_value) logger.info("Had find the element \' %s \' successful " "by %s via value: %s " % (element.text, selector_by, selector_value)) except NoSuchElementException as e: logger.error("NoSuchElementException: %s" % e) self.get_windows_img() # take screenshot elif selector_by == "n" or selector_by == 'name': element = self.driver.find_element_by_name(selector_value) elif selector_by == "c" or selector_by == 'class_name': element = self.driver.find_element_by_class_name(selector_value) elif selector_by == "l" or selector_by == 'link_text': element = self.driver.find_element_by_link_text(selector_value) elif selector_by == "p" or selector_by == 'partial_link_text': element = self.driver.find_element_by_partial_link_text(selector_value) elif selector_by == "t" or selector_by == 'tag_name': element = self.driver.find_element_by_tag_name(selector_value) elif selector_by == "x" or selector_by == 'xpath': try: element = self.driver.find_element_by_xpath(selector_value) logger.info("Had find the element \' %s \' successful " "by %s via value: %s " % (element.text, selector_by, selector_value)) except NoSuchElementException as e: logger.error("NoSuchElementException: %s" % e) self.get_windows_img() elif selector_by == "s" or selector_by == 'selector_selector': element = self.driver.find_element_by_css_selector(selector_value) else: raise NameError("Please enter a valid type of targeting elements.") return element # 输入 def send_keys_text(self, selector, text): el = self.find_element(selector) el.clear() try: el.send_keys(text) logger.info("Had type \' %s \' in inputBox" % text) except NameError as e: logger.error("Failed to type in input box with %s" % e) self.get_windows_img() # 清除文本框 def clear(self, selector): el = self.find_element(selector) try: el.clear() logger.info("Clear text in input box before typing.") except NameError as e: logger.error("Failed to clear in input box with %s" % e) self.get_windows_img() # 点击元素 def click(self, selector): el = self.find_element(selector) val = el.get_attribute("value") try: el.click() logger.info("The element buttin %s was clicked."% val ) except NameError as e: logger.error("Failed to click the element with %s" % e) # 或者网页标题 def get_page_title(self): logger.info("Current page title is %s" % self.driver.title) return self.driver.title @staticmethod def sleep(seconds): time.sleep(seconds) logger.info("Sleep for %d seconds" % seconds)
基于basepage的的页面对象Baidu_homepage
from framework.base_page import BasePage class HomePage(BasePage): input_box="id=>kw" search_submit_btn="id=>su" def send_keys_text_search(self,text): self.send_keys_text(self.input_box,text) def click_btn_search(self): self.click(self.search_submit_btn)
测试用例的书写
import unittest import time from framework.brower_engin import BrowseEngin from pageobject.baidu_homepage import HomePage class BaiduSearch(unittest.TestCase): def setUp(self): browser = BrowseEngin(self) self.driver = browser.open_browser(self) def tearDown(self): self.driver.quit() def test_baidu_search(self): homePage = HomePage(self.driver) homePage.send_keys_text_search("selenium") time.sleep(2) homePage.click_btn_search() time.sleep(2) # homePage.get_sreenshot("百度截图")