一、浏览器窗口切换
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()