首页 > 其他分享 >selenium窗口切换

selenium窗口切换

时间:2024-01-05 18:33:42浏览次数:35  
标签:webdriver 窗口 selenium driver EC element window 切换

一、handle窗口切换

  当点击某个元素后,会重新生成一个新的页签,但此时我们的操作仍然在原先的窗口当中,如果要在新的窗口继续操作元素,那么就要用到handle窗口切换的方法。

常用方法:

  • window_handles:获取当前打开的所有窗口句柄,返回类型为一个列表。
  • current_window_handle:获取当前窗口的句柄。
  • switch_to.window(handle_path):切换窗口,handle_path参数代表的是一个窗口句柄。

  当操作某个元素后需要等待新的元素出现,我们用到了显性等待,EC给了我们一个方法为visibility_of_element_located(),表示元素可见,那么在handle窗口切换时也涉及到等待,那就是等待新的窗口打开,我将用一般方法和新的方法来展示,具体用法如下:

方法一(使用time.sleep()强制等待):

import time
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
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id("su").click()
loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click() # 点击后新的窗口出现
# 切换到新的窗口,在新窗口去操作元素
time.sleep(1) # 强制等待1秒
# 1、获取当前打开的所有窗口。--- 窗口列表。handles
wins = driver.window_handles
print(wins)
# 打印打前窗口的句柄
print(driver.current_window_handle)
# 2、切换的语句 ,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
driver.switch_to.window(wins[-1])
# 3、在新的页面当中,找元素,并操作
loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()

方法二(使用骚操作EC.new_window_is_opened()方法):

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
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id("su").click()
loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
cur_handles = driver.window_handles # 点击操作之前的窗口总数为1
driver.find_element(*loc).click() # 点击后新的窗口出现
# 等待一下,窗口总数会变成2个
# 切换到新的窗口,在新窗口去操作元素。
# Ec条件 -- 等待新窗口出现
WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles)) # 更稳定的窗口等待
# 再次获取窗口列表 。总数为2
# 1、获取当前打开的所有窗口。--- 窗口列表。handles
wins = driver.window_handles
print(wins)
# 打印打前窗口的句柄
print(driver.current_window_handle)
# 2、切换的语句,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
driver.switch_to.window(wins[-1])
# 3、在新的页面当中,找元素,并操作。
loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()

二、iframe切换

当我们要在新的html页面操作元素,就要切换到新的html页面后才能进行接下来的操作,常用方法如下:

  • switch_to.frame(path):切换到新的html页面,path支持下标、name、WebElement对象三种参数
  • switch_to.default_content():切换到主html页面
  • switch_to.parent_frame():切换到上一层html页面(父页面)

在iframe切换中也有等待,除了使用time.sleep()方法外,EC给了我们一个方法为frame_to_be_available_and_switch_to_it(),表示iframe有效并切换到iframe当中,它支持下标、name、WebElement对象以及元组四种方法传参,两种方法如下:

方法一(使用time.sleep()强制等待):

import time
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
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("qq空间")
driver.find_element_by_id("su").click()
loc = (By.XPATH, "//a[text()='官网']/preceding-sibling::a[text()='-分享生活,留住感动']")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
cur_handles = driver.window_handles # 点击操作之前的窗口总数为1
driver.find_element(*loc).click() # 点击后新的窗口出现
# 等待一下,窗口总数会变成2个
# 切换到新的窗口,在新窗口去操作元素。
# Ec条件 -- 等待新窗口出现
WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles)) # 更稳定的窗口等待
# 再次获取窗口列表 。总数为2
# 获取当前打开的所有窗口。 --- 窗口列表。handles
wins = driver.window_handles
# 切换的语句,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
driver.switch_to.window(wins[-1])
# 切换iframe
driver.switch_to.frame("login_frame")
time.sleep(1) # 强制等待1秒
driver.find_element_by_xpath("//div[@id='bottom_web']//a[text()='注册新帐号']").click()

方法二(使用骚操作EC.frame_to_be_available_and_switch_to_it()方法):

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
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("qq空间")
driver.find_element_by_id("su").click()
loc = (By.XPATH, "//a[text()='官网']/preceding-sibling::a[text()='-分享生活,留住感动']")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
cur_handles = driver.window_handles # 点击操作之前的窗口总数为1
driver.find_element(*loc).click() # 点击后新的窗口出现
# 等待一下,窗口总数会变成2个
# 切换到新的窗口,在新窗口去操作元素。
# Ec条件 -- 等待新窗口出现
WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles)) # 更稳定的窗口等待
# 再次获取窗口列表 。总数为2
# 获取当前打开的所有窗口。 --- 窗口列表。handles
wins = driver.window_handles
# 切换的语句,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
driver.switch_to.window(wins[-1])
# EC条件 - 等待iframe有效并切换到iframe当中
WebDriverWait(driver, 20).until(
EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@id="login_frame"]')))
driver.find_element_by_xpath("//div[@id='bottom_web']//a[text()='注册新帐号']").click()

三、alert弹框切换

如何区分是alert弹框呢?一个简单的方法就是无法使用元素定位的弹框,并且需要优先处理后才能操作后面的元素,常用方法如下:

switch_to.alert:切换到alert弹框

accept():确定

dismiss():取消

send_keys(keysToSend) :输入文本,keysToSend表示输入的文本内容字符串

text():获取弹出框里面的内容

在EC里面也给alert弹框设定了一个方法,alert_is_present()方法表示等待alert弹框出现并切换到alert弹框中

方法一(常规做法):

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://XXXX")
# 做一个操作,导致alert框出现
driver.find_element_by_id("idxxx").click()
# 切换到alert弹框
alert = driver.switch_to.alert
# 获取alert的文本内容
print(alert.text)
# 点击确定,关闭弹框
alert.accept()

方法二(使用骚操作EC.alert_is_present()方法):

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://XXXX")
# 做一个操作,导致alert框出现
driver.find_element_by_id("idxxx").click()
# EC条件 -- 等待alert弹框出现,并切换到alert当中
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
# 获取alert的文本内容
print(alert.text)
# 点击确定,关闭弹框
alert.accept()

 

标签:webdriver,窗口,selenium,driver,EC,element,window,切换
From: https://www.cnblogs.com/liziqi927/p/17947826

相关文章

  • Python中pytest命令行实现环境切换
    前言在自动化测试过程中经常需要在不同的环境下进行测试验证,所以写自动化测试代码时需要考虑不同环境切换的情况。pytest钩子函数pytest_addoption可以很好帮我们解决这个痛点。pytest_addoption(parser, pluginmanager)注册argparse样式选项和ini样式配置值,在测试运行开始时调用......
  • Python+Selenium实现UI自动化
    自动化测试:自动化测试是把以人为驱动的测试行为转化成机器执行的一种过程,通常在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较,再此过程中,为了节省人力,时间或硬件资源,提高测试效率,便引用了自动化测试的概念Selenium:是......
  • 使用Selenium库的C#爬虫程序来爬取腾讯云的视频
    这是一个使用Selenium库的C#爬虫程序,用于爬取https://cloud.tencent.com/的视频。代码中使用了代理服务器,代理服务器的主机地址为www.duoip.cn,端口号为8000。以下是完整的代码解释://导入Selenium库usingOpenQA.Selenium;//创建一个ChromeDriver实例,使用代理服务器IWebDriver......
  • 在 PHP 数组中的两个字符串之间切换
    在PHP中,你可以使用array_flip()函数和条件语句来在数组中的两个字符串之间进行切换。以下是一个示例://创建一个数组,包含两个字符串的映射关系$mapping=array('string1'=>'value1','string2'=>'value2');//定义当前需要切换的字符串$currentString='stri......
  • Android Studio Build窗口出现中文乱码问题
    问题:Androidstudio使用时,报错出现提示乱码问题,无法查看具体报错问题,如图解决方法:可点击studio状态栏的Help—>EditCustomVMOptions,操作如下图在文件后面添加-Dfile.encoding=UTF-8(要注意不能有空格,否则studio可能打不开)添加完成后重启AndroidStudio,就可以看到......
  • 【充电管理】USB/锂电-电源自动切换电路
    很多电子产品中都用电池供电,通过USB充电。当插上USB的时候,如果设备仍然需要工作,我们希望通过USB供电同时切断电池的供电。下面就介绍如何通过一个二极管、一个电阻和一个PMOS管来实现。设计该种电路时的原则:1.USB插入后,由USB供电,电池不供电。2.USB插入后,USB的线路不能直接向......
  • (selenium) 让浏览器在 webdriver 调用后保持打开状态
    在使用selenium进行webdriver测试时,浏览器在调用完后将会自动关闭,即使没有调用"driver.close()"。有时候,可能需要特意将浏览器保持开启状态,此时需要使用detach参数#'detach'=True将不会自动关闭options.add_experimental_option('detach',True)具体示例代码如......
  • Python+Selenium+Pytest+Allure+Jenkins实现的Web自动化框架
    目录一、测试的项目二、需求分析三、用例设计-部分用例举例四、框架说明4.1测试框架结构图如下:4.2项目功能五、代码设计与功能说明5.1POM简介:PageObjectModle页面对象模型5.2基础封装层:pages/basePage.py5.3PO页面对象层:pages/userLoginPage.py5.4TestCase测试用例层:testc......
  • python_selenium定位页面元素
    页面元素常用的定位方法有id、name、css、xpathid和name直接通过对应的值定位class属性值有多个值时,使用css选择器定位只需要其中一个属性值即可,使用xpath时,属性值需要全部写上示例:<inputtype=""autocomplete="on"placeholder="密码"id="pwdid"name="password"c......
  • [AHK2] 为toolwindow窗口添加阴影效果
    如下示例g:=Gui('-Caption+Border');或包含+ToolWindowg.SetFont('s13','consolas')g.AddText('c4c071d',data)g.BackColor:='f6eeda'g.Show('x100y50')WinSetTransColor('white......