一、浏览器窗口切换
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 种弹框:
从 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_web\web_baitianyang\web项目 前期\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()