Selenium+python进行web自动化实践杂记

杂记索引:

1.关于unittest中的is_element_present函数该如何传参

2.关于网页上弹窗(alert)的处理

3.关于打印出当前正在执行的函数名称的方法

4.关于在原始网页上跳转后返回原网页的方法

5.关于断言assertEqual返回值报错:True != True
Expected :True
Actual   :True

6.关于import其他文件夹中的py文件

7.关于文件相对路径的表达方式

8.关于配置文件的设置格式

9.关于获取web后端数据的方法

10.关于获取的json数据包含中文而显示\uxxxx的解决

 

 正文内容:

1.关于unittest中的is_element_present函数

1 def is_element_present(self, how, what):
2     """验证页面元素是否出现的工具函数"""
3     from selenium.common.exceptions import NoSuchElementException
4     try:
5         driver.find_element(by=how, value=what)
6     except NoSuchElementException as e:
7         return False
8     return True

这个函数多用于确认页面某个元素是否存在,而如果需要对比确认某元素的值是否为某值时,不适合用这个

在使用过程中,多次遇到“how”位置的参数不确定该填写哪些方式,参考了模块包中的响应信息源码(位置在)"安装环境\Anaconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978,源码中的函数如下:

 1     def find_element(self, by=By.ID, value=None):
 2         """
 3         Find an element given a By strategy and locator. Prefer the find_element_by_* methods when
 4         possible.
 5 
 6         :Usage:
 7             element = driver.find_element(By.ID, 'foo')
 8 
 9         :rtype: WebElement
10         """
11         if self.w3c:
12             if by == By.ID:
13                 by = By.CSS_SELECTOR
14                 value = '[id="%s"]' % value
15             elif by == By.TAG_NAME:
16                 by = By.CSS_SELECTOR
17             elif by == By.CLASS_NAME:
18                 by = By.CSS_SELECTOR
19                 value = ".%s" % value
20             elif by == By.NAME:
21                 by = By.CSS_SELECTOR
22                 value = '[name="%s"]' % value
23         return self.execute(Command.FIND_ELEMENT, {
24             'using': by,
25             'value': value})['value']

分析可知,在使用之前需要导入模块包By,即 from selenium.webdriver.common.by import By

之后 “how”处可传参为By.IDBy.CSS_SELECTORBy.TAG_NAMEBy.CLASS_NAME,By.NAME (实际在使用时还可以用By.XPATH和LINK_TEXT)

简言之:

(1)先导入所需的By模块包

(2)再写入is_element_present函数,最后调用即可

 

2.关于网页上弹窗(alert)的处理

参考了博客文章:https://www.cnblogs.com/101718qiong/p/8027944.html

简言之:

(1)先导入弹窗处理模块  from selenium.webdriver.support import expected_conditions as EC

(2)再写函数代码如下,来使用

 

1 alert = EC.alert_is_present()(driver)
2 if alert:
3     print("出现弹窗提示:%s "%alert.text)
4     alert.accept()
5     print("点击确认,进行下一步")
6 else:
7     print("未出现弹窗")

 

 

3.关于打印出当前正在执行的函数名称的方法

简言之:

(1)先导入所需的模块包: import sys

(2)在所需位置插入语句 print("\n当前执行函数名:%s " % sys._getframe().f_code.co_name) 即可

 

4.关于在原始网页上跳转后返回原网页的方法

即当在第一个网页上点击某元素后,并未打开新的网页而是在原有网页的基础上跳转了的情况,就不能使用窗口句柄返回原网页了

简言之:

在原有网页上发生跳转后,返回操作前的页面使用:driver.back()

 

5.关于断言assertEqual返回值报错:

 

 

 当返回结果为布尔值时,最好换一个断言方式,用assertTrue,下方图片是断言值适应类型:

 

 因此,如果要使用断言,优先考虑适配的断言方法,否则可能出现难以理解的报错

 

6.关于import其他文件夹中的py文件

在引用目标文件所在的文件夹中新建一个__init__.py文件(内容可为空),然后再from 文件夹名字(这里的名字是所在文件夹的上一级文件夹名) import 文件名

 

7.关于文件相对路径的表达方式

../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)

 

8.关于配置文件的设置

 1 """配置文件书写形式如下,一般命名为config.ini"""
 2 
 3 [Default]
 4 url=xxxxxxxxx
 5 driver=firefox
 6 URL_test=xxxxxxxxx
 7 
 8 [LoginData]
 9 username=admin
10 usernamenull=
11 usernamewrong=admin1
12 userpw=123
13 userpwwrong=123456
14 userpwnull=
1 """配置文件的使用"""
2 import configparser
3 
4 conf = configparser.ConfigParser()
5 conf.read("相对路径\配置文件名")
6 
7 url = conf.get("Default","url")
8 name = conf.get("LoginData","username")
9 password = conf.get("LoginData","userpw")

 

9.关于获得web后端数据的方法

在web页面中,通过F12调出开发者工具后,在“网络”中,可以找到后端传来的如下内容

 

 

 如果想要获取这些响应内容,方法如下:

 1     def get_Ajax(self,base_url):
 2         """Get the data transmitted asynchronously by the backend, the return value is a list containing all the data information"""
 3         """base_url:the request url,change it you could get any other ajax part you need"""
 4 
 5         try:
 6             cookielist = self.driver.get_cookies()
 7             for cookiedict in cookielist:
 8                 if cookiedict['name'] == 'CiSession':
 9                     cookievalue = cookiedict['value']
10                 else:
11                     pass
12             cookie = "testcookie=yes;CiSession=" + cookievalue
13             header = {
14                 'User-Agent':"根据自己的网页浏览器情况修改",
15                 'Cookie': cookie,
16                         }
17 
18             response = requests.get(base_url,headers=header)
19             Ajax_list = response.json()
20             return Ajax_list
21 
22         except requests.ConnectionError as e:
23             self.log("--ERROR--:", e.args)

其中base_url就是上上张图片中的“文件”名,并且通过这种方式也避免了cookie过期的情况。

 

10.关于获取的json数据包含中文而显示\uxxxx的解决

在获取的json数据中添加参数:

json.dumps(jsondata,ensure_ascii=False,indent=4)

其中的indent参数表示转换后缩进为4,这样显得数据整洁好看

 

posted @ 2020-03-25 16:43  -Ruirui-  阅读(364)  评论(0)    收藏  举报