当前位置:   article > 正文

webUI自动化之基本框架搭建(python + selenium + unittest)_python ui自动框架_web ui自动化python

web ui自动化python

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

17 from selenium.webdriver.support.wait import WebDriverWait
18
19
20
21 from selenium.webdriver.support import expected_conditions as EC
22
23
24
25 from GAD_webUI.commen.universal_method import UniversalMethod
26
27 from selenium.webdriver.common.action_chains import ActionChains
28
29
30
31
32
33 class BasePage(object):
34
35 def init(self, driver, path=‘https://xxx’):
36
37 self.driver = driver
38
39 self.url = path
40
41 self.driver.implicitly_wait(30) # 隐式等待,设置一次全局有效
42
43 self.driver.maximize_window()
44
45 self.navigation_els = UniversalMethod.get_yaml_info(
46
47 r’D:\G_webUI\data\navigation.yaml’)
48
49
50
51 def open_page(self):
52
53 self.driver.get(self.url) # 打开浏览器
54
55
56
57 # 单个元素的定位方法1
58
59 def find_element(self, *args):
60
61 try:
62
63 return self.driver.find_element(*args)
64
65 except NoSuchElementException:
66
67 print(“未找到该元素:” + str(args))
68
69
70
71 # 单个元素的定位方法2
72
73 def find_element_v(self, *args):
74
75 try:
76
77 return WebDriverWait(self.driver, 5, 0.5).until(EC.visibility_of_element_located(*args))
78
79 except (NoSuchElementException, TimeoutException):
80
81 print(“超过元素定位等待时长,无法获取到该元素,请检查定位路径”)
82
83
84
85 # 单个元素的定位方法3
86
87 def find_element_p(self, *args):
88
89 try:
90
91 return WebDriverWait(self.driver, 5, 0.5).until(EC.presence_of_element_located(*args))
92
93 except (NoSuchElementException, TimeoutException):
94
95 print(“超过元素定位等待时长,无法获取到该元素,请检查定位路径”)
96
97
98
99 # 多个元素的定位方法1
100
101 def find_elements(self, *loc):
102
103 try:
104
105 return self.driver.find_elements(*loc)
106
107 except (NoSuchElementException, TimeoutException):
108
109 print(“未找到该元素:” + str(loc))
110
111
112
113 # 多个元素的定位方法2
114
115 def find_elements_v(self, *loc):
116
117 try:
118
119 return WebDriverWait(self.driver, 5, 0.5).until(EC.visibility_of_any_elements_located(*loc))
120
121 except (NoSuchElementException, TimeoutException):
122
123 print(“超过元素定位等待时长,无法获取到该元素,请检查定位路径”)
124
125
126
127 # 多个元素的定位方法3
128
129 def find_elements_p(self, *loc):
130
131 try:
132
133 return WebDriverWait(self.driver, 5, 0.5).until(EC.presence_of_all_elements_located(*loc))
134
135 except (NoSuchElementException, TimeoutException):
136
137 print(“超过元素定位等待时长,无法获取到该元素,请检查定位路径”)
138
139
140
141 # 点击元素,以JS脚本的方式
142
143 def click_JS(self, element):
144
145 self.driver.execute_script(‘arguments[0].click();’, element)
146
147
148
149 # 点击元素,普通方式
150
151 def click(self, element_xp):
152
153 try:
154
155 self.find_element_p((By.XPATH, element_xp)).click()
156
157 except AttributeError:
158
159 print(‘元素获得为空,无属性可用’)
160
161
162
163 # 清除输入框
164
165 def clear_input(self, element_xp):
166
167 try:
168
169 self.find_element_p((By.XPATH, element_xp)).clear()
170
171 except AttributeError:
172
173 print(‘元素获得为空,无属性可用’)
174
175
176
177 # 输入框输入值
178
179 def send_kw(self, element_xp, kw):
180
181 try:
182
183 self.find_element_p((By.XPATH, element_xp)).send_keys(kw)
184
185 except AttributeError:
186
187 print(‘元素获得为空,无属性可用’)
188
189
190
191 # 模拟键盘向页面发送end指令(滑动到页面底部)
192
193 def page_end(self, table_xp):
194
195 try:
196
197 self.find_element_p((By.XPATH, table_xp)).send_keys(Keys.END)
198
199 except AttributeError:
200
201 print(‘元素获得为空,无属性可用’)
202
203
204
205 # 鼠标移动到指定元素上
206
207 def move_element(self, element_xp):
208
209 move = self.find_element_p((By.XPATH, element_xp))
210
211 ActionChains(self.driver).move_to_element(move).perform()
212
213
214
215 # 双击元素
216
217 def double_click(self, element):
218
219 ActionChains(self.driver).double_click(element).perform()
220
221
222
223 # 切换到指定窗口
224
225 def switch_window(self, num):
226
227 handles = self.driver.window_handles # 获取当前窗口句柄集合
228
229 try:
230
231 self.driver.switch_to.window(handles[num]) # 切换到指定窗口
232
233 except Exception:
234
235 raise


### 5、 loginPage.py内容:



  • 1
  • 2
  • 3
  • 4
  • 5

1 from GAD_webUI.commen.universal_method import UniversalMethod
5 from GAD_webUI.pages.base_page import BasePage
10

11 class LoginPage(BasePage):
12
13 login_els = UniversalMethod.get_yaml_info(
14
15 r’D:\G_webUI\data\login.yaml’) # login_els是个字典
16
17
18
19 def login_GAD(self, username, password):
20
21 self.open_page() # 打开浏览器
22
23 self.send_kw(self.login_els[‘username’], username) # 输入用户名
24
25 self.send_kw(self.login_els[‘password’], password) # 输入密码
26
27 self.click(self.login_els[‘login_btn’]) # 点击登录
28
29 sleep(2)
30
31
32
33 error_el = self.find_element_p((By.XPATH, self.login_els[‘login_error’]))
34
35 if error_el:
36
37 return error_el.text
38
39 else:
40
41 print(‘登录成功’)


### 6、 test\_login.py(测试类)内容:




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1 import unittest
2
3 from time import sleep
4
5 from selenium import webdriver
6
7 from GAD_webUI.pages.login_page import LoginPage
8
9
10
11 class Login(unittest.TestCase):
12
13 driver = webdriver.Chrome()
14
15
16
17 @classmethod
18
19 def setUpClass(cls, ) -> None:
20
21 cls.login_page = LoginPage(cls.driver)
22
23
24
25 def test_login(self, username=‘v-luoyang’, password=‘123456’):
26
27 error_text = self.login_page.login_GAD(username, password)
28
29 self.assertFalse(error_text is not None, msg=error_text) # 如果错误信息存在,则登录失败,输出错误提示信息
30
31
32
33 @classmethod
34
35 def tearDownClass(cls) -> None:
36
37 sleep(5)
38
39 cls.driver.quit()
40
41
42
43 if name == ‘main’: # 执行all_test_run.py 时,需将该段注释掉
44
45 unittest.main()


### 7、 引入测试报告


在小节2中已经实现了。


result = BeautifulReport(UniversalMethod.createSuite()) # 创建测试套件容器  
     result.report(filename=now+‘G\_smoke’, description=‘G冒烟测试’, report\_dir=filename) # 生成测试报告


### 8、 执行完测试自动发送邮件(经尝试可用)




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

1 import os
2
3
4
5 “”"
6
7 这个文件主要是配置发送邮件的主题、正文等,将测试报告发送并抄送到相关人邮箱的逻辑。
8
9 “”"
10
11 import smtplib
12
13 from email.mime.text import MIMEText
14
15 from email.mime.multipart import MIMEMultipart
16
17
18
19 class SendEmail(object):
20
21 def init(self, username, passwd, recv, title, content,
22
23 file_path=None, ssl=False,
24
25 email_host=‘smtp.163.com’, port=25, ssl_port=465):
26
27 self.username = username # 用户名
28
29 self.passwd = passwd # 密码
30
31 self.recv = recv # 收件人,多个要传list [‘a@qq.com’,'b@qq.com]
32
33 self.title = title # 邮件标题
34
35 self.content = content # 邮件正文
36
37 self.file_path = file_path # 附件路径,如果不在当前目录下,要写绝对路径
38
39 self.email_host = email_host # smtp服务器地址
40
41 self.port = port # 普通端口
42
43 self.ssl = ssl # 是否安全链接
44
45 self.ssl_port = ssl_port # 安全链接端口
46
47
48
49 # 发送邮件
50
51 def send_email(self):
52
53 msg = MIMEMultipart()
54
55 msg.attach(MIMEText(self.content)) # 邮件正文的内容
56
57
58
59 # 构造附件
60
61 for f_path, file_dirs, files in os.walk(self.file_path):
62
63 for file in files:
64
65 msg.attach(self._att_html(os.path.join(f_path, file)))
66
67
68
69 msg[‘Subject’] = self.title # 邮件主题
70
71 msg[‘From’] = self.username # 发送者账号
72
73 msg[‘To’] = ‘,’.join(self.recv) # 接收者账号列表
74
75 if self.ssl:
76
77 self.smtp = smtplib.SMTP_SSL(self.email_host, port=self.ssl_port)
78
79 else:
80
81 self.smtp = smtplib.SMTP(self.email_host, port=self.port)
82
83 # 发送邮件服务器的对象
84
85 self.smtp.login(self.username, self.passwd)
86
87 try:
88
89 self.smtp.sendmail(self.username, self.recv, msg.as_string())
90
91 pass
92
93 except Exception as e:
94
95 print(‘出错了。。’, e)
96
97 else:
98
99 print(‘发送成功!’)
100
101 self.smtp.quit()
102
103
104
105 # 构造邮件附件
106
107 @staticmethod
108
109 def _att_html(filename):
110
111 # 构造附件
112
113 atthtml = MIMEText(open(filename, ‘rb’).read(), ‘base64’,
114
115 ‘utf-8’) # 文件放在同一路径,不放在同一路径改一下比如’D:/test/report.html
116
117 atthtml[“Content-Type”] = ‘application/octet-stream’
118
119 atthtml[“Content-Disposition”] = ‘attachment;filename = “GAD_Smoke_report.html”’
120
121 return atthtml
122
123
124
125
126 # 调用并发送邮件
127 if name == ‘main’:
128
129 m = SendEmail(
130
131 username=‘cicada_luo@163.com’,  # 这里填发送者邮箱
132
133 passwd=‘TCBXOAOF…’,    # 授权码还是什么忘记了
134
135 recv=[‘1761885773@qq.com’],  # 接收者邮箱
136
137 title=‘G——smoke’,
138
139 content=‘G——smoke测试报告’,
140
141 file_path=‘D:\G_webUI\report’,  # 发送的文件
142
143 email_host=‘smtp.163.com’,
144
145 ssl_port=465,
146
147 ssl=True,
148
149 )
150
151 m.send_email()  # 发送邮件


### 9、 引入DDT


① 安装DDT,打开cmd,输入pip install ddt


② 在测试类上写上@ddt,表示该用例类需要进行数据驱动


③ 在测试方法上写上@file\_data(file\_path),表示引入外部文件进行数据驱动。


④ 如果步骤③传入的文件是yaml格式,那么用例方法参数需要用\*\*args来接收文件的内容(表示接收文件的所有内容到该参数中) ;如果传入的文件是其他的格式,那么用一个参数接收即可(接收的是json数据格式的值)



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

1 import unittest
2
3
4
5 from ddt import file_data, ddt
6
7 from selenium import webdriver
8
9 from GAD_webUI.pages.login_page import LoginPage
10
11
12
13
14
15 @ddt
16
17 class test_Login(unittest.TestCase):
18
19
20
21 def setUp(self) -> None:
22
23 self.driver = webdriver.Chrome()
24
25 self.login_page = LoginPage(self.driver)
26
27
28
29 def tearDown(self) -> None:
30
31 self.driver.quit()
32
33
34
35 @file_data(r’D:\G_webUI\data\user_login.yaml’)
36
37 def test_login(self, **kwargs):
38
39 print(kwargs)
40
41 error_text = self.login_page.login_GAD(kwargs[‘username’], kwargs[‘password’])
42
43 self.assertFalse(error_text is not None, msg=error_text) # 如果错误信息存在,则登录失败,输出错误提示信息
44
45 print(“------------------------------------”)
46

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-ZKZxt0fO-1713410670026)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/963890
推荐阅读
相关标签
  

闽ICP备14008679号