元素定位 基本操作 多窗口处理和iframe处理 多浏览器处理 执行javascript脚本 处理时间控件 上传文件 弹框处理

页面基本定位

https://www.cnblogs.com/070727sun/p/12368636.html

页面基本操作

https://www.cnblogs.com/070727sun/p/12369788.html

多窗口处理

方法:首先获取到目的页面的句柄,然后获取到所有页面的句柄。然后使用driver.switch_to_windows切换到对应的页面的地址。
1、获取到当前的窗口的句柄(driver.current_window_handle)
2、获取到所有的窗口句柄(driver.window_handles)——>返回值是数组
3、切换到另一个窗口的句柄(driver.switch_to_window)

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

class TestHandle():
    def setup(self):
        self.drive = webdriver.Chrome()
        self.drive.implicitly_wait(5)
        self.drive.get('https://www.baidu.com/')
        self.drive.maximize_window()

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

    def test_01(self):
        current_handle = self.drive.current_window_handle
        print(f'当前的句柄: {current_handle}')
        self.drive.find_element_by_class_name('s-top-left.s-isindex-wrap a:nth-child(1)').click()
        handles = self.drive.window_handles
        print(f'所有句柄: {handles}')
        sleep(2)
        self.drive.switch_to.window(handles[1])
        # content = self.drive.find_element_by_id("headline-tabs").text
        # content = self.drive.find_element_by_link_text('国内').text
        content = self.drive.find_element(By.ID,"headline-tabs").text
        print(f'获取的标题: {content}')
        sleep(2)
if __name__ == '__main__':
    pytest.main()

iframe处理

frame介绍
在web自动化中,如果一个元素定位不到,那么很有可能是在iframe中。
什么是frame?
1、frame是html中的框架,在html中,所谓的框架就死活可以在同一个浏览器中显示不止一个页面。
2、基于html的框架,又分为垂直框架和水平框架(cols,rows)
Frame分类
1、frame标签包含frameset、frame、iframe三种
2、frameset和普通的标签一样,不会影响正常的定位,可以使用index、id、name、webelement任意方式定位。
3、而frame与iframe对selenium定位而言是一样的。selenium有一组方法对frame进行操作。
演示:https://www.runoob.com/tags/tag-iframe.html
https://www.w3school.com.cn/tags/tag_frameset.asp

frame切换
frame分为两种:一种是嵌套的 2、一种是未嵌套的
切换frame方法
1、driver.switch_to.frame() # 根据元素id或者index切换frame
2、dirver.switch_to.default_content() # 切换到默认frame
3、driver.switch_to.parent_frame() # 切换到父级frame
使用方法
未嵌套
dirver.switch_to_frame(“frame的id”)
driver.switch_to_frame(“frame-index”)frame无ID的时候依据索引来处理,索引从0开始driver.switch_to_frame(0)
嵌套的iframe
对于嵌套的先进入到iframe的父节点,再进到子节点,然后可以对子节点里面的对象进行处理和操作
driver.switch_to.frame(“父节点”)
driver.switch_to.frame(“子节点”)

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestIframe():
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.runoob.com/try/try.php?filename=tryjsref_ondrop')
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)

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

    def test_iframe(self):
        # 进入iframe前,先切换进入
        self.driver.switch_to.frame('iframeResult')
        print(self.driver.find_element(By.ID,'dragtarget').text)
        # 进入后切换回来 下面两种方式均可
        # self.drive.switch_to.parent_frame()  # 返回到父节点
        self.driver.switch_to.default_content()  # 返回到 默认节点,也就是最外层的
        print(self.driver.find_element_by_id('submitBTN').text)
if __name__ == '__main__':
    pytest.main()

多浏览器处理

chrome,Firefox,headless等浏览器的自动化支持
传不同参数来测试不同的浏览器,用来做浏览器的兼容性测试

from selenium import webdriver
import os

class Base():
    def setup(self):
        browser = os.getenv("browser")  # getenv(参数)函数是一个用于获取环境变量的函数  运行是要给参数browser = firefox
        if browser == 'firefox':
            self.driver = webdriver.Firefox()
        elif browser == 'headless':
            self.driver = webdriver.PhantomJS()
        else:
            self.driver = webdriver.Chrome()

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

运行: browser=firefox pytest test_frame.py

执行jsvascript脚本

使用selenium直接在当前页面中进行js交互
常见的几种操作使用js实现
selenium能够执行js,这使得selenium拥有更为强大的能力,既然能执行js,那么js能做的事,selenium应该大部分也能做
直接使用js操作页面,能解决很多clicj()不生效的问题
页面滚动到底部,顶部
处理富文本,时间控件的输入

selenium中如何调用js
1、execute_script:执行js
2、return:可以返回js的返回结果
3、execute_script:arguments传参

import pytest
import time
from base import Base

class Test_JS(Base):
    def test_01_js_scroll(self):
        self.drive.get('https://www.baidu.com/')
        self.drive.find_element_by_id('kw').send_keys('测试')
        element = self.drive.execute_script('return document.getElementById("su")')
        element.click()
        self.drive.execute_script('document.documentElement.scrollTop=1000')
        time.sleep(2)
        print(self.drive.execute_script('return JSON.stringify(performance.timing)'))

if __name__ == '__main__':
    pytest.main()   

时间控件
大部分时间控件都是readonly属性,需要手动去选择对应的时间,手工测试中很容易做到,自动化中控件的时间总可以使用js来操作。
处理时间控件思路:
1、要取消日期的readonly属性
2、给value赋值
写js代码来实现如上的1、2,再webdriver对js进行处理。

import pytest
import time
from base import Base

class Test_JS(Base):
    def test_02_js_datetime(self):
        self.drive.get('https://www.12306.cn/index/')
        self.drive.execute_script('return document.getElementById("train_date")')
        self.drive.execute_script('document.getElementById("train_date").removeAttribute("readonly")')
        time.sleep(4)
        print(self.drive.execute_script('document.getElementById("train_date").value="2021-09-09"'))
        time.sleep(10)

上传文件
input标签可以直接使用send_keys(文件地址)上传文件
用法:
el=driver.find_element_by_id(“上传按钮id”)
el.send_keys(“文件路径+文件名”)

    def test_03_upload(self):
        self.drive.get('https://www.baidu.com/')
        self.drive.find_element_by_class_name('soutu-btn').click()
        time.sleep(2)
        self.drive.find_element_by_class_name('upload-pic').send_keys('/Users/...../1.png')
        time.sleep(2)

弹框处理
在页面操作中有时会遇到JavaScript所产生的alert、confirm以及prompt弹框,可以使用switch_to.alert()方法定位到。然后使用text/accept/dismiss/send_keys等方法进行操作。参考教你分辨alert、window、div模态框,及操作。
操作alert常用的方法:
1、switch_to.alert():获取当前页面上的告警框
2、text:返回alert/confirm/prompt中的文字信息
3、accept():接受现有的告警框
4、dismiss():解散现有的告警框
send_key(keysToSend):发送文本至警告框。keysToSend:将文本发送至告警框。

from selenium.webdriver import ActionChains
from base import Base
from time import sleep
import pytest

class Test_alert(Base):
    def test_01_alert(self):
        self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
        self.driver.switch_to.frame('iframeResult')  # 切换到对应的iframe
        # 操作拖拽
        drag = self.driver.find_element_by_id('draggable')
        drop = self.driver.find_element_by_id('droppable')
        action = ActionChains(self.driver)
        action.drag_and_drop(drag,drop).perform()
        sleep(2)
        print('点击alert')
        # 获取到对应弹窗的文本
        print(self.driver.switch_to.alert.text)
        # 点击弹窗的"确认"键
        self.driver.switch_to.alert.accept()
        # 切回iframe
        self.driver.switch_to.default_content()
        # 打印"点击运行"按钮文本
        print(self.driver.find_element_by_id('submitBTN'))
        sleep(2)

if __name__ == '__main__':
    pytest.main()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值