ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

web自动化你需要知道的

2021-04-11 17:57:45  阅读:165  来源: 互联网

标签:web 需要 浏览器 self driver switch cookie 自动化 frame


web控件定位

XPATH定位
‘//[@id=“s_tab”]//a[1]’ #定位到s_tab元素下面第一个a元素
'//
[@id=“u”]/a’ 和’//*[@id=“u”]//a’ #这里面一个斜杠和两个斜杠的区别是:一个斜杠表示子元素,两个斜杠表示的是下面的子子孙孙的元素
css selector
‘#kw’
‘#kw a’ #中间有一个空格(空格表示子子孙孙,如果是箭头表示子元素),表示id="kw"元素后面的a元素
‘#kw a:nth-child(2)’ #表示a元素的父元素下面的第二个元素
‘#kw a:nth-last-child(1)’ #表示a元素的父元素下面的倒数第一个元素

web控件交互官方文档:

https://selenium-python.readthedocs.io/api.html
ActionChains:执行PC端的鼠标点击,双击,右键,拖拽等事件,对H5页面操作无效
执行原理:调用ActionChains的方法时,不会被立即执行,而是将所有的操作,按顺序存放在一个队列里,当你调用perform()方法时,队列中的事件会依次执行
具体用法:执行PC端的鼠标点击,双击,右键,拖拽等事件
actions=ActionChains(driver)
actions.move_to_element(element)
actions.click(element)
actions.perform()
TouchAction:模拟PC和移动端的点击,滑动,拖拽,多点触控等多种手势操作,可以对H5进行操作
https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.touch_actions
手势控制:
具体用法:
actions=TouchActions(driver)
action.tag(element)
action.perform()
表单操作
表单使用form标签,我们首先定位到表单元素,然后去操作元素(清空、输入或者点击等)

网页frame与多窗口处理

多窗口处理
点击某个链接,会重新打开一个窗口,对于这种情况,想在新页面操作,就得先切换窗口了
获取窗口的唯一标识用句柄表示,所以只要切换句柄,就可以在多个页面灵活操作了
处理的流程就是
1、先获取当前的窗口句柄(driver.current_window_handle)
2、再获取到所有的窗口句柄(driver.window_handles)
3、判断是否是想要操作的窗口,如果是,就可以对窗口进行操作,如果不是,跳转到另外一个窗口,对另外一个窗口进行操作(driver.switch_to.window(window[-1]))
frame处理
frame是html中的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面
frame标签包含frameset、frame、iframe三种
frameset和普通标签一样,不会影响正常的定位,可以使用id,name任意方式定位frame
selenium有一组方法对frame进行操作,frame存在两种,一种是嵌套的,一种是未嵌套的
切换frame:
driver.switch_to.frame() #根据元素id或者index切换frame
driver.switch_to.default_content() #切换到默认frame
driver.switch_to.parent_frame() #切换到父级frame
对于未嵌套的:
driver.switch_to_frame(“frame的id”)
driver.switch_to_frame(“frame-index”) #frame无ID的时候依据索引来处理,索引从0开始driver.switch_to_frame(0)
对于嵌套的:先进入到iframe的父节点,再进入到子节点,然后可以对子节点里面的对象进行处理和操作
driver.switch_to.frame(“父节点”)
driver.switch_to.frame(“子节点”)

selenium处理多浏览器

通过传递不同的参数来测试不同的浏览器,用来做浏览器兼容性测试
方法就是我们可以在setup方法中修改代码如下即可

    def setup(self):
        browser = os.getenv("browers")
        if browser == 'firefox':
            self.driver = webdriver.Firefox()
        else:
            self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com/")
        self.driver.maximize_window()

运行的过程中,传递浏览器参数即可,使用命令browser=chrome pytest 要运行的文件

执行javascript脚本

使用selenium直接在当前页面中进行js交互,那么如何调用js呢,我们可以使用execute_script方法

import time
from selenium import webdriver
class TestWindow():
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com/")
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)

    def teardown(self):
        self.driver.quit()

    def test_window(self):
        self.driver.find_element_by_id("kw").send_keys("小米")
        ele = self.driver.execute_script("return document.getElementById('su')").click()
        self.driver.execute_script("document.documentElement.scrollTop=10000")
        time.sleep(3)

大部分的时间控件都是readonly属性,需要手动去选择对应的时间,处理时间控件的思路:
取消日期的readonly属性,再给value赋值,然后再使用webdriver对js进行处理

    def test_date(self):
        self.driver.get("https://www.12306.cn/index/")
        self.driver.execute_script("a=document.getElementById('train_date');a.removeAttribute('readonly')")
        self.driver.execute_script("document.getElementById('train_date').value='2021-03-08'")
        time.sleep(2)
        print(self.driver.execute_script("return document.getElementById('train_date').value"))

文件上传弹框处理

文件上传
input标签可以直接使用send_keys(文件地址)上传文件
用法:
el = driver.find_element_by_id(“上传按钮id”)
el.send_keys(“文件路径+文件名”)
弹窗处理机制
在页面操作中有时候会遇到JS所生成的alert、confirm以及prompt弹窗,可以使用switch_to.alert()方法定位到,然后使用text/accept/dismiss/send_keys等方法进行操作,我们可以通过定位元素分辨alert、window、div模态框
操作alert的常用方法:
switch_to.alert():获取当前页面的警告框
text:返回alert、confirm、prompt弹窗中的文字信息
accept():接受现有警告窗
dismiss():解散现有警告窗
send_keys(keysToSend):发送文本至警告窗。keysToSend将文本发送至警告窗

Page Object设计模式和原则

https://martinfowler.com/bliki/PageObject.html
https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/
六大原则:

  1. 公共的方法代表页面提供的服务
  2. 不需要暴露页面的交互细节
  3. 通常来说不要做断言
  4. 方法返回其他PO
  5. 不需要代表整个页面
  6. 相同的行为导致的不同结果,封装成不同的方法

使用remote复用已有的浏览器

在docs命令中开启调试,在此之前,需要把chrome关掉,使用命令
chrome --remote-debugging -port=9222,回车之后,会打开一个干净的浏览器,我们可以复用这个浏览器了
在代码这样编辑

  def setup_method(self, method):
    options = Options()
    #和浏览器打开的调试窗口进行通信
    #浏览器要使用--remote-debugging-port=9222
    options.debugger_address = "127.0.0.1:9222"
    self.driver = webdriver.Chrome(options=options)

使用cookie登录

浏览器复用是可以绕过登陆进行测试的,当然我们也可以使用cookie的方式,去真实的进行登录,然后进行测试
在这里插入图片描述
以企业微信登录为例,我们先使用浏览器复用打印下cookie

  def test_wework01(self):
    self.driver.get("https://work.weixin.qq.com/wework_admin/frame")
    print(self.driver.get_cookies())

运行结果如下:
在这里插入图片描述
也就是我们将要使用打印出来的这个cookie进行登录,我们可以把cookie存在一个虚拟的数据库里面,然后每次运行去获取我们cookie,代码如下:

class Test():
  def setup_method(self):
    options = Options()
    #和浏览器打开的调试窗口进行通信
    #浏览器要使用--remote-debugging-port=9222
    options.debugger_address = "127.0.0.1:9222"
    self.driver = webdriver.Chrome()

  def test_wework(self):
    self.driver.get("https://work.weixin.qq.com/")
    #创建或者打开一个数据库
    db = shelve.open("cookies")
    cookies = db["cookies"]
    for cookie in cookies:
      if "expiry" in  cookie.keys():
        cookie.pop("expiry")
      #把字典加入到driver的cookie中
      self.driver.add_cookie(cookie)
    self.driver.get("https://work.weixin.qq.com/wework_admin/frame")
    self.driver.find_element(By.ID, "menu_contacts").click()
    db.close()

运行结果如下:
在这里插入图片描述

标签:web,需要,浏览器,self,driver,switch,cookie,自动化,frame
来源: https://blog.csdn.net/qq_41780297/article/details/114440366

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有