(五)selenium 切换frame_窗口_执行js

一、 Switch_to

处理场景:处理JS弹框,切换frame窗口 切换浏览器窗口

1.1、处理JS弹框

JavaScript 简称JS,应用于HTML网页,通过操纵网页窗口及网页元素,从而实现动态效果。
有:警告框alert、确认框confirm、提示框prompt

相关方法

alert = driver.switch_to_alert  # 切换焦点到弹框
alert.accept()   # 对弹框点击确定按钮
alert.dismiss()   # 对弹框点击取消
alert.text    # 获取弹框文本内容
alert.send_keys(keysToSend)   # 往弹框输入框输入内容

1.2、切换frame窗口

如果元素在html的frame 或 iframe中,则无法直接定位到元素。需要先切换到该frame中,再进行定位及其他操作

self.driver.switch_to.frame(frame_reference=) # 参数为frame的id 或name
self.driver.switch_to.frame(0);   # 按索引值切换frame
self.driver.switch_to.parent_frame()   # 切换到上级frame
self.driver.switch_to.default_content()   # 切换到默认内容

1.3、切换浏览器窗口

浏览器中有多个窗口,如果想切换到其他窗口操作,需要调用switch_to方法切换到目标窗口:

driver.switch_to.window("window_name")  # 切换焦点到指定窗口
driver.current_window_handle  # 获取当前窗口的  handle
driver.window_handles  # 获取当前浏览器所有窗口的  handle


    handels = driver.window_handles;   
    for handele in handels:
        driver.switch_to.window(handele)
        if driver.title == "测试网页":
            break
  def test_001(self):
        self.driver.get("https://www.baidu.com/")
        self.driver.find_element_by_id("kw").send_keys("selenium")
        self.driver.find_element_by_id("su").click()
        # self.driver.find_element_by_link_text("Selenium_百度百科").click()
        self.driver.find_element_by_partial_link_text("百度百科").click()

        #获取当前窗口handle
        currenthandl=self.driver.current_window_handle
        # 获取全部的窗口handles
        handl_list=self.driver.window_handles
        # 切换到第二个窗口
        self.driver.switch_to.window(handl_list[1])
        self.driver.find_element_by_id("query").send_keys("自动化测试")

思考:当你不知道要操作的元素 在那个窗口 怎么设计操作浏览器中有多个窗口,如果想切换到其他窗口操作,需要调用switch_to方法切换到目标窗口:

driver.switch_to.window("window_name")  # 切换焦点到指定窗口
driver.current_window_handle  # 获取当前窗口的  handle
driver.window_handles  # 获取当前浏览器所有窗口的  handle


    handels = driver.window_handles;   
    for handele in handels:
        driver.switch_to.window(handele)
        if driver.title == "测试网页":
            break
  def test_001(self):
        self.driver.get("https://www.baidu.com/")
        self.driver.find_element_by_id("kw").send_keys("selenium")
        self.driver.find_element_by_id("su").click()
        # self.driver.find_element_by_link_text("Selenium_百度百科").click()
        self.driver.find_element_by_partial_link_text("百度百科").click()

        #获取当前窗口handle
        currenthandl=self.driver.current_window_handle
        # 获取全部的窗口handles
        handl_list=self.driver.window_handles
        # 切换到第二个窗口
        self.driver.switch_to.window(handl_list[1])
        self.driver.find_element_by_id("query").send_keys("自动化测试")

思考:当你不知道要操作的元素 在那个窗口 怎么设计操作

二、鼠标键盘操作模拟

一般来说我们与页面的交互可以使用WebElement的方法进行点击等操作,但是有时候我们需要一些更复杂的动作,就需要用到我们的Action Chains了

通过ActionChains 对象模拟鼠标复杂操作:

from selenium.webdriver.common.action_chains import ActionChains


        actions = ActionChains(self.driver);
        actions.click(on_element)  # 鼠标左键单击指定的元素e
        actions.click()   # 鼠标左键点击当前元素
        actions.context_click()  #鼠标右键单击
        actions.double_click(on_element)  # 鼠标双击
        actions.click_and_hold(on_element)  # 鼠标点住不放
        actions.move_to_element(to_element)  # 鼠标悬停
        actions.drag_and_drop(source,target)  # 鼠标拖拽元素到某元素
        actions.drag_and_drop_by_offset(scource,xoffset,yoffset)  # 拖拽元素到某位置, 左右:x,上下:y,下右为正
        
        actions.perform()    # 执行存储在任务列表中的操作
        actions.reset_actions()  # 清除储存在任务列表中的操作
        

ActionChains 模拟键盘操作

普通键:
● 无名按键:a-z,0-9
● 有名按键:Tab、Enter、Space(空格键)、BackSpace(退格键)
修饰键:修饰键单独使用没有意义,一般和别的按键配合使用
Alt、Shift、Control

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys


Actions操作:
action = ActionChains(driver);

# 使用示例
action = ActionChains(self.driver)

action.send_keys(Keys.ENTER)  #  对当前元素 按回车键
action.send_keys_to_element(element, *keys_to_send)  # 对指定元素 做指定操作
action.key_down(Keys.CONTROL).send_keys("a")  # ctrl +a 操作
action.key_down(Keys.SHIFT).send_keys("abc")  # 输入大写 abc

二、js代码执行

webdriver 无法完成的操作,可以由JS配合完成

self.driver.execute_script("return document.title"); # 获取title
self.driver.execute_script("arguments[0].setAttribute('style',arguments[1]);",element,"color:orange;border:4px solid orange;") # 设置橘色边框

参考JS:
    弹出提示框:alert('我是一个弹框')
    改变元素熟悉: q = document.getElementById('kw')
    			  q.style.display='block';
        
self.driver.execute_async_script()  # 异步请求:客户端请求服务端,会先回复收到,不会立即返回结果

文件上传下载

    self.driver.get("http://106.14.225.213/register")
     self.driver.find_element_by_class_name("avatar").click()
     self.driver.find_element_by_xpath("//*[@name='file']").send_keys(r"C:\Users\huangwei\Desktop\test\test_img.jpg")
     self.setup(3)

截图

滚动条

posted @ 2022-05-05 15:10  钟鼎山林  阅读(262)  评论(0编辑  收藏  举报