• 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”位置的参数不确定该填写哪些方式,参考了模块包中的响应信息源码(位置在)"安装环境Anacondalibsite-packagesseleniumwebdriver emotewebdriver.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(" 当前执行函数名:%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,这样显得数据整洁好看

  • 相关阅读:
    C# 反射数据库数据过程中值类型存在DBNull的处理方法 == System.DBNull.Value
    Git 未能顺利结束 (退出码 128)解决办法 git常用命令流程图
    IDEA之The directory xxxxx is under Git, but is not registered in the Settings.
    git push提交成功后如何撤销回退 我是手动修改再提交一次 。。或者IDEA有代码修改历史记录功能 进行回退
    IDEA,发现Project文件目录不见了,只剩External Libraries的原因
    分布式事务 seata
    idea设置类,方法模板 阿里检测
    随笔
    初学一点点空间分解和有理标准型
    Vue2+Cesium1.9+热力图开发笔记
  • 原文地址:https://www.cnblogs.com/RuiRuia/p/12567127.html
Copyright © 2020-2023  润新知