zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    跟我一起学Go系列:gRPC 全局数据传输和超时处理
    跟我一起学Go系列:Go gRPC 安全认证方式-Token和自定义认证
    c++中的继承关系
    数值型模板参数的应用
    [源码解析] 机器学习参数服务器Paracel (3)------数据处理
    [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader
    [源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampler
    [源码解析] 机器学习参数服务器 Paracel (2)--------SSP控制协议实现
    [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构
    [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现
  • 原文地址:https://www.cnblogs.com/wuzm/p/12422063.html
Copyright © 2011-2022 走看看