python ui自动化表单_基于python语言下的UI自动化测试框架搭建(一)

最近在搭一个UI自动化测试框架,想把整个搭建过程分享出来,如果有不对的地方,希望大家能够指正,首先创建一个名称为,antomation_framework_demo的工程文件,

pycharm中工程及文件如下图所示:

5b2a2a5ab1bbf10de7873cc64b7a1547.png

config:文件中包含调用的浏览器驱动及打开的URL地址

framework:

1、包含定义的页面基类,封装常用的页面操作方法

2、包含打开浏览器操作以及在相对路径下获取浏览器driver

3、日志处理方法

logs:执行日志以时间格式保存在该文件夹下,如:20190809162812.txt

pageobjects:定义homepage类,用来处理常用页面操作方法的操作

screenshots:执行截图存放文件,命名格式与日志命名格式一致

test_report:存放执行后生成的测试报告

testsuits:持续集成执行方法

tools:浏览器驱动存放文件夹

好了,具体的包已经创建完成了,现在开始看一下config文件,首先在config文件夹下右键新建->file文件->名称输入config.ini点击确定,打开config.ini,输入如下配置:

#配置文件,只存储浏览器类型和服务器URL

#调用的浏览器驱动,保留现在使用的浏览器驱动

[browserType]

#browserName = Firefox

browserName = Chrome

#browserName = IE

#打开URL地址,以百度为例

[testServer]

URL = https://www.baidu.com

framework包中文件如下所示:

9eacc41c5e52afba2ea15c853218d167.png

在framework包下创建base_page.py文件,文件中封装一些页面常用操作方法,可以自己在这个类中进行对应方法的添加,代码如下:

1 # coding=utf-8

2 import time

3 from selenium.common.exceptions import NoSuchElementException

4 import os.path

5 from 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 def quit_browser(self):

21 self.driver.quit()

22

23 # 浏览器前进操作

24 def forward(self):

25 self.driver.forward()

26 logger.info("Click forward on current page.")

27

28 # 浏览器后退操作

29 def back(self):

30 self.driver.back()

31 logger.info("Click back on current page.")

32

33 # 隐式等待

34 def wait(self, seconds):

35 self.driver.implicitly_wait(seconds)

36 logger.info("wait for %d seconds." % seconds)

37

38 # 点击关闭当前窗口

39 def close(self):

40 try:

41 self.driver.close()

42 logger.info("Closing and quit the browser.")

43 except NameError as e:

44 logger.error("Failed to quit the browser with %s" % e)

45

46 # 保存图片

47 def get_windows_img(self):

48 """

49 在这里我们把file_path这个参数写死,直接保存到我们项目根目录的一个文件夹.\Screenshots下

50 """

51 file_path = os.path.dirname(os.path.abspath('.')) + '\screenshots\\'

52 rq = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))

53 screen_name = file_path + rq + '.png'

54 try:

55 self.driver.get_screenshot_as_file(screen_name)

56 logger.info("Had take screenshot and save to folder : \screenshots")

57 except NameError as e:

58 logger.error("Failed to take screenshot! %s" % e)

59 self.get_windows_img()

60

61 # 定位元素方法

62 def find_element(self, selector):

63 """

64 这个地方为什么是根据=>来切割字符串,请看页面里定位元素的方法

65 submit_btn = "id=>su"

66 login_lnk = "xpath => //*[@id='u1']/a[7]" # 百度首页登录链接定位

67 如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位

68 :param selector:

69 :return: element

70 """

71 element = ''

72 if '=>' not in selector:

73 return self.driver.find_element_by_id(selector)

74 selector_by = selector.split('=>')[0]

75 selector_value = selector.split('=>')[1]

76

77 if selector_by == "i" or selector_by == 'id':

78 try:

79 element = self.driver.find_element_by_id(selector_value)

80 logger.info("Had find the element \' %s \' successful "

81 "by %s via value: %s " % (element.text, selector_by, selector_value))

82 except NoSuchElementException as e:

83 logger.error("NoSuchElementException: %s" % e)

84 self.get_windows_img() # take screenshot

85 elif selector_by == "n" or selector_by == 'name':

86 element = self.driver.find_element_by_name(selector_value)

87 elif selector_by == "c" or selector_by == 'class_name':

88 element = self.driver.find_element_by_class_name(selector_value)

89 elif selector_by == "l" or selector_by == 'link_text':

90 element = self.driver.find_element_by_link_text(selector_value)

91 elif selector_by == "p" or selector_by == 'partial_link_text':

92 element = self.driver.find_element_by_partial_link_text(selector_value)

93 elif selector_by == "t" or selector_by == 'tag_name':

94 element = self.driver.find_element_by_tag_name(selector_value)

95 elif selector_by == "x" or selector_by == 'xpath':

96 try:

97 element = self.driver.find_element_by_xpath(selector_value)

98 logger.info("Had find the element \' %s \' successful "

99 "by %s via value: %s " % (element.text, selector_by, selector_value))

100 except NoSuchElementException as e:

101 logger.error("NoSuchElementException: %s" % e)

102 self.get_windows_img()

103 elif selector_by == "s" or selector_by == 'selector_selector':

104 element = self.driver.find_element_by_css_selector(selector_value)

105 else:

106 raise NameError("Please enter a valid type of targeting elements.")

107

108 return element

109

110

111 # 输入

112 def type(self, selector, text):

113

114 el = self.find_element(selector)

115 el.clear()

116 try:

117 el.send_keys(text)

118 logger.info("Had type \' %s \' in inputBox" % text)

119 except NameError as e:

120 logger.error("Failed to type in input box with %s" % e)

121 self.get_windows_img()

122

123 # 清除文本框

124 def clear(self, selector):

125

126 el = self.find_element(selector)

127 try:

128 el.clear()

129 logger.info("Clear text in input box before typing.")

130 except NameError as e:

131 logger.error("Failed to clear in input box with %s" % e)

132 self.get_windows_img()

133

134 # 点击元素

135 def click(self, selector):

136

137 el = self.find_element(selector)

138 try:

139 el.click()

140 logger.info("The element \' %s \' was clicked." % el.text)

141 except NameError as e:

142 logger.error("Failed to click the element with %s" % e)

143

144 # 或者网页标题

145 def get_page_title(self):

146 logger.info("Current page title is %s" % self.driver.title)

147 return self.driver.title

148

149 @staticmethod

150 def sleep(seconds):

151 time.sleep(seconds)

152 logger.info("Sleep for %d seconds" % seconds)

browser_engine.py中封装获取根目录下浏览器驱动方法和浏览器操作方法,但需要注意的是,如果在里面使用中文,需要切换方法,但是小编在切换了以后还是不对,可能是因为使用2.7版本python吧,用3.x版本的朋友可以尝试一下使用中文进行日志打印的操作,代码如下:

1 # -*- coding:utf-8 -*-

2 import ConfigParser

3 import os.path

4 from selenium import webdriver

5 from framework.logger import Logger

6

7 logger = Logger(logger="BrowserEngine").getlog()

8

9

10 class BrowserEngine(object):

11 dir = os.path.dirname(os.path.abspath('.')) # 注意相对路径获取方法

12 chrome_driver_path = dir + '/tools/chromedriver.exe'

13 ie_driver_path = dir + '/tools/IEDriverServer.exe'

14

15 def __init__(self, driver):

16 self.driver = driver

17

18 # read the browser type from config.ini file, return the driver

19 def open_browser(self, driver):

20 config = ConfigParser.ConfigParser()

21 # file_path = os.path.dirname(os.getcwd()) + '/config/config.ini'

22 file_path = os.path.dirname(os.path.abspath('.')) + '/config/config.ini'

23 config.read(file_path)

24 # config.read(file_path,encoding='UTF-8'), 如果代码有中文注释,用这个,不然报解码错误

25

26 browser = config.get("browserType", "browserName")

27 logger.info("You had select %s browser." % browser)

28 url = config.get("testServer", "URL")

29 logger.info("The test server url is: %s" % url)

30

31 if browser == "Firefox":

32 driver = webdriver.Firefox()

33 logger.info("Starting firefox browser.")

34 elif browser == "Chrome":

35 driver = webdriver.Chrome(self.chrome_driver_path)

36 logger.info("Starting Chrome browser.")

37 elif browser == "IE":

38 driver = webdriver.Ie(self.ie_driver_path)

39 logger.info("Starting IE browser.")

40

41 driver.get(url)

42 logger.info("Open url: %s" % url)

43 driver.maximize_window()

44 logger.info("Maximize the current window.")

45 driver.implicitly_wait(10)

46 logger.info("Set implicitly wait 10 seconds.")

47 return driver

48

49 def quit_browser(self):

50 logger.info("Now, Close and quit the browser.")

51 self.driver.quit()

标签:info,python,self,driver,selector,UI,logger,element,搭建

来源: https://www.cnblogs.com/yk617558302/p/11328244.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值