首页 > 其他 > 详细

selenium中的三大切换

时间:2019-09-16 20:59:49      阅读:119      评论:0      收藏:0      [点我收藏+]

一、窗口切换

使用方法:

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


# 实例化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("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中的三大切换

原文:https://www.cnblogs.com/xingyunqiu/p/11517973.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!