一、窗口切换

使用方法:

1、获取到打开的所有的窗口,句柄handles

all_handles = driver.window_handles

print(all_handles)

2、获取当前的窗口

driver.current_window_handle

print(driver.current_window_handle)

3、利用切换的语句,切换到想要操作的窗口(HTML页面)

# 获取到的所有窗口为一个列表,用索引取值

driver.switch_to.window(all_handles[-1])

举例说明:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://baidu.com") wait = WebDriverWait(driver, 20)
# 定位输入框,并输入“腾讯课堂”进行搜索
driver.find_element_by_id('kw').send_keys("腾讯课堂")
# 点击搜索按钮
driver.find_element_by_id('su').click()
# 满足以下条件,才会进行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出现了新的HTML页面
time.sleep(2) # 获取所有的窗口,句柄
all_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(all_handles[-1]) # 在新的页面中找元素,并操作。
# 找到登录的元素,并点击登录的按钮
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2) # 关闭浏览器
driver.quit()

上述的方法在新窗口出现之后,需要有一个强制的等待页面加载的时间time.sleep(2),这样是为了保证在页面未加载出来去点击,导致程序报错。我们采用的是强制等待的方式;那么在这里有一个小小的骚操作,在expected_conditions文件中,有一个new_window_is_opened类,等待新窗口的出现;该类调用时要传入一个current_handles的参数,功能为:所有的窗口句柄>current_handles,结果为True,条件成立。这个骚操作主要是为了替代强制等待这种方法,当然两种方法都可以用。

骚操作举例说明:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://baidu.com") wait = WebDriverWait(driver, 20)
# 定位输入框,并输入“腾讯课堂”进行搜索
driver.find_element_by_id('kw').send_keys("腾讯课堂")
# 点击搜索按钮
driver.find_element_by_id('su').click()
# 满足以下条件,才会进行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc)) # 在新的窗口出现之前,获取窗口列表,这时窗口数为1
cur_handles = driver.window_handles
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出现了新的HTML页面
# 出现新的窗口之后,窗口数为2,2>1,条件为True
wait.until(EC.new_window_is_opened(cur_handles))
# 再次获取所有的窗口
# 获取所有的窗口,句柄
all_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(all_handles[-1]) # 在新的页面中找元素,并操作。
# 找到登录的元素,并点击登录的按钮
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2) # 关闭浏览器
driver.quit()

二、iframe切换

切换的条件:如果你要操作的元素,在iframe当中, 你才需要切换
页面元素(容器)-里面是一个HTML页面

iframe定位方式    driver.switch_to.frame()
    index,下标
        driver.switch_to.frame(3)
    name属性
        driver.switch_to.frame("name属性的值")
    webelement对象
        driver.switch_to.frame(driver.find_element_by_xpath('xpath表达式'))
            支持selenium中8中定位方法
    嵌套的iframe
        driver.switch_to.frame()
    直接返回main页面
        driver.switch_to.default_content()
    切换到父级iframe
        driver.switch_to.parent_frame()

举例说明:以登录腾讯课堂为例

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 实例化webdriver中的Chome对象
driver = webdriver.Chrome()
# 访问腾讯课堂
driver.get('https://ke.qq.com/') # 查找登录按钮,设置等待条件
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
# 找到找到登录的元素在进行下一步操作,查找时间上限为10秒
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
# 找到元素,并点击
driver.find_element(*loc).click()
time.sleep(3) # 点击QQ登录,等待元素被找到进行下一步
loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
time.sleep(1)

# iframe切换方式一:通过下标、name属性、webelement对象进行切换
# 弹出一个iframe登录框,定位iframe框
driver.switch_to.frame('login_frame_qq')
# 使用显性等待
loc = (By.ID, 'switcher_plogin')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
# 查找用账号密码登录元素
driver.find_element(*loc).click()
time.sleep(0.5)
# 输入账号
driver.find_element_by_id('u').send_keys("xxxx")
# 输入密码
driver.find_element_by_id('p').send_keys('xxxxx')
driver.find_element_by_id('login_button').click()
time.sleep(3)
# 退出
driver.quit()

 iframe骚操作:

 from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 创建一个Chrome对象
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 访问腾讯课堂
driver.get('https://ke.qq.com/') # 定位登录按钮,并点击操作,利用显示等待
loc = (By.ID, 'js_login')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element_by_id('js_login').click() # 定位QQ登录按钮,并点击操作,显示等待
loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(1) # iframe切换方式二:下标、name属性、webelement对象、元素定位元组四种
# iframe骚操作,EC条件中,frame_to_be_available_and_switch_to_it这个条件,说明iframe有效并切换到iframe中
# 切换到登录的iframe页面中
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="login_frame_qq"]')))
driver.find_element_by_id('switcher_plogin').click()
time.sleep(1)
# 定位输入框,输入账户名、密码
driver.find_element_by_id('u').send_keys('xxx')
driver.find_element_by_id('p').send_keys('xxx')
# 点击登录按钮
driver.find_element_by_id('login_button').click()
time.sleep(3) # 关闭浏览器
driver.quit()

 alert弹框:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC # 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问某网站
driver.get("http://xxx.com")
# 做一个操作,出现alert弹窗
driver.find_element_by_id('xxx').click() # 方式一:
# 切换到alert弹窗
alert_1 = driver.switch_to.alert # 方式二(骚操作):
# EC条件,alert弹框已出现,并切换到alert弹框中
alert_2 = WebDriverWait(driver, 10).until(EC.alert_is_present()) # 三种弹框,分别的操作方式
# 点击确定,关闭弹窗
alert_1.accept()
alert_2.accept()
# 点击取消
alert_1.dismiss()
alert_2.dismiss()
# 输入文本内容
alert_1.send_keys('xxx')
alert_2.send_keys('xxx') # 关闭浏览器
driver.quit()

JavaScript三种弹框方式:https://www.w3school.com.cn/js/js_popup.asp

selenium中的元素操作之三大切换(二)的更多相关文章

  1. selenium中的元素操作之三大等待(一)

    等待时做什么,为什么使用等待 在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作是否完 ...

  2. selenium中的元素操作之下拉列表操作(四)

    下拉列表操作中分为两种:select.非select 1.非select的下拉框操作 非select下拉列表操作与网页元素操作一致,找到元素,定位元素,设置等待,点击元素等等 接下来操作百度的设置按钮 ...

  3. 【Selenium】selenium中隐藏元素如何定位?

    前言 面试题:selenium 中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~很多面试官自己都搞不清楚 ...

  4. 巧妙利用selenium中的JS操作来处理特殊的文本框

    在使用selenium对页面进行相关操作时,有时候会遇到以下三种情况: 1.日期框:无法直接输入文本,必须要选择某一天的日期并点击才会填入文本框: 2.检索框:可以直接输入文本,但必须要点击根据输入的 ...

  5. selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?

    1.在寻找元素时,加上显示等待或者隐式等待,这样在对元素进行操作之前保证元素被找到,进而提高成功率: 2.在对元素操作之前,比如click,如果该元素未display(非hidden),就需要先滚动到 ...

  6. Selenium webdriver Java 元素操作

    本来这些东西网上一搜一大堆,但是本着收集的精神,整理一份放着吧!哈!哈!哈! 1. 输入框(text field or textarea) WebElement element = driver.fi ...

  7. python selenium中等待元素出现及等待元素消失操作

    在自动化测试中,很多时候都会有等待页面某个元素出现后能进行下一步操作,或者列表中显示加载,直到加载完成后才进行下一步操作,但时间都不确定,如下图所示 幸运的是,在selenium 2后有一个模块exp ...

  8. selenium webdriver python 元素操作

    常用操作 click 点击某个元素 driver.find_element_by_id(“su”).click()   clear driver.find_element_by_id(“kw”).cl ...

  9. <自动化测试>之<selenium API 查找元素操作底层方法>

    搜罗了一些查找元素的除标准语句外,另外的语句使用方法,摘自 开源中国 郝云鹏driver = webdriver.Chrome(); 打开测试页面 driver.get( "http://b ...

随机推荐

  1. hdu2037 今年暑假不AC[贪心][区间调度问题]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu2037 题干 代码和解释 本题使用贪心.有三种贪心策略:开始时间最早,结束时间最早,用时最短.第二种是正确的策略,因为结束得越早,后面就可以有 ...

  2. bind named.conf 的理解

    [root@46 /]#yum -y install bind bind-chroot bind-libs bind-utils caching-nameserver目录说明/var/named/ch ...

  3. docker删除名称为<none>的镜像

    docker rmi $(docker images | awk '/^<none>/ { print $3 }')

  4. php如何实现三级分销

    Q: 项目要实现三级分销;对于数据库的设计和用户注册后给所有上级(最多三级)返利 但是一点头绪都没有,请大神帮忙给个思路! 如果是直接注册给奖励20元如果是通过二维码或者链接进入的注册页面 找到上级 ...

  5. linux 实时监控网速脚本(转)

    #!/bin/bash ethn=$ while true do RX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{pri ...

  6. 通过 UNSAFE 来实现一个 Atomic 的 CAS 辅助类【原创】

    public abstract class AbstractUnSafeCas<T> { @SuppressWarnings("unused") private vol ...

  7. UDP用于保持大量终端的在线与控制,应用与业务则通过TCP去实现。这个和FTP服务控制与数据分离,采取不同的连接,有异曲同工之处 端口映射老化时间

    移动端IM/推送系统的协议选型:UDP还是TCP? http://www.52im.net/thread-33-1-1.html

  8. Kafka架构与原理

    前言 kafka是一个分布式消息队列.具有高性能.持久化.多副本备份.横向扩展能力.生产者往队列里写消息,消费者从队列里取消息进行业务逻辑.一般在架构设计中起到解耦.削峰.异步处理的作用. kafka ...

  9. iOS App转让、转移、迁移(App transfer) -- 仅需四步

    当需要将某个 App 出售给其他开发人员,或想要将其移至其他 App Store Connect 组织,则您需要转让该 App.您无需将 App 从 App Store 下架,即可将其所有权转让给另一 ...

  10. bootCDN引用的bootstrap前端框架套件和示例

    这是bootCDN上引用的bootstrap前端框架套件,由多个框架组合而成,方便平时学习和测试使用.生产环境要仔细琢磨一下,不要用开发版,而要用生产版.bootCDN的地址是:https://www ...