web自动化你需要知道的

2021/4/11 18:29:04

本文主要是介绍web自动化你需要知道的,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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自动化你需要知道的的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程