selenium 常见元素操作:三大切换--浏览器窗口切换、iframe 窗口切换、alert弹窗切换

一、浏览器窗口切换

 1、目前有多少句柄

2、想要切换的窗口的句柄是多少

 获取窗口的总数以及句柄

方法一:

  • 1.获取当前打开的所有窗口;window_handles
  • 2.切换到新窗口;switch_to.window(wins[-1])

方法二:

  • 1.操作之前获取窗口总数1;window_handles(
  • 2.EC条件等待新窗口出现;new_window_is_opened
  • 3.获取当前打开的所有窗口总数2;window_handles
  • 4.切换到新窗口;switch_to.window(wins[-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
#访问一个网页
driver = webdriver.Chrome(service_log_path='E:柠檬班二chromedriver_service.log')
driver.get("https://www.baidu.com")

driver.find_element_by_id('kw').send_keys("柠檬班")
driver.find_element_by_id('su').click()
WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located((By.XPATH,'//a[contains(text(),"吧_百度贴吧")]')))
#step1:获取窗口的总数以及句柄,新打开的窗口位于最后一个
#handles=driver.window_handles
#操作,引起窗口数量的变化, 窗口数量变为3
driver.find_element_by_xpath('//a[contains(text(),"吧_百度贴吧")]').click()

#等待新的窗口出现
#WebDriverWait(driver,10).until(EC.new_window_is_opened(handles)

#重新获取一次窗口
#handles=driver.window_handles
#切换到最新打开的窗
#driver.switch_to.window(handles[-1])

handles=driver.window_handles
print(handles)
#当前窗口的句柄
print(driver.current_window_handle)
#切换
driver.switch_to.window(handles[-1])
WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located((By.ID,'j_head_focus_btn')))
driver.find_element_by_id('j_head_focus_btn').click()
#'j_head_focus_btn' 关注id

# EC.new_window_is_opened() 这个条件也可以用,比如打开某个网页比较慢的时候

二、iframe内嵌窗口切换

 iframe框架里面的元素定位

1、如果我们要切换到你想要的内嵌页面上去,就需要定位iframe框架,然后切换过去,切换用到的方法:driver.switch_to.frame();

然后可以自己去定位框架里面的元素,进行对应的操作。

2、找到要切换的iframe,

切换:driver.switch_to.frame(【index(下标),name,webelement(find操作)】)

例子:driver.switch_to.frame()

3、当iframe上的操作完成后,想重新回到主页面上操作元素,这时候,就可以使用:driver.switch_to.default_content();

返回到主页面。

【两种方式,7种方法。】

方式一:支持三种方法;switch_to.frame(切换方法) 

  • 切换三种方法切换:下标切换、name名字属性切换、webelement对象切换

方式二:更加稳定,支持四种

  • 骚操作: EC条件 - 条件:等待iframe有效并切换到iframe当中。
  • EC模块中的 frame_to_be_available_and_switch_to_it判断方法
  • 支持四种方法切换:下标切换、name名字属性切换、webelement对象切换、元素定位元组
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(service_log_path='E:柠檬班二chromedriver_service.log')
#访问一个网页
driver.get("https://www.baidu.com")
#找到登录点击
driver.find_element_by_xpath('//*[@id="u1"]/a[@class="lb"]').click()

#设置登录弹窗的显性等待,使用定位类型和值一起定位
id = 'TANGRAM__PSP_10__footerULoginBtn'
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,id)))  #(By.ID,id)这里传的是个元组

#找到用户名密码登录方式
driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()

#方式一:切换iframe =进入另外一个html
driver.switch_to.frame("ptlogin_iframe")    通过name属性
driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@name="ptlogin_iframe"]'))   通过xpath
time.sleep(0.5)
driver.find_element_by_id('switcher_plogin')
#方式二:等待iframe存在可见
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it("ptlogin_iframe"))
time.sleep(0.5)

#从ifame当中回到默认的页面当中
driver.switch_to.default_content()
driver.switch_to.parent_frame()

三、alter弹窗切换

弹窗切换-----会使用alert类来处理,获取弹窗内文本内容、确定、取消、输入内容四种方法

浏览器定位时选不中弹窗,不是 弹窗 就是 windows上传文件窗口

借用大佬总结的 javascript 的 3 种弹框:https://www.cnblogs.com/xyao1/p/7451518.html

从 HTML 页面 切换到 js 的三种弹框内

js弹框,元素无法定位

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

driver = webdriver.Chrome()

driver.get(r"D:python_webweb_baitianyangweb项目 前期myH.html")
# 做一个操作,导致alert框出现;点击后弹窗出现
driver.find_element_by_id("press_me").click()

# 方式一:直接切换到alert弹框;switch_to.alert(
# alert = driver.switch_to.alert

# 方式二:更加稳定;使用EC模块中的alert_is_present条件判断弹窗是否已出现,并切换到alert当中
# 骚操作:EC条件 : 判断alert弹框是否已出现,并切换到alert当中;
alert_is_present
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())

# 获取 alert 中的文本内容
print(alert.text)
# 点击确定,关闭弹框
alert.accept()

time.sleep(5)   # 等待5秒,
driver.quit()   # 关闭浏览器

# 获取 alert 中的文本内容:
# alert.text
# 点击确定,关闭弹框:accept
# alert.accept()
# 点击取消使用:
# alert.dismiss()
# 往弹框中出入文本:
# alert.Send_keys()
原文地址:https://www.cnblogs.com/wuzm/p/12422063.html