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()
  • 相关阅读:
    Mvc+三层(批量添加、删除、修改)
    js中判断复选款是否选中
    EF的优缺点
    Git tricks: Unstaging files
    Using Git Submodules
    English Learning
    wix xslt for adding node
    The breakpoint will not currently be hit. No symbols have been loaded for this document."
    Use XSLT in wix
    mfc110ud.dll not found
  • 原文地址:https://www.cnblogs.com/wuzm/p/12422063.html
Copyright © 2011-2022 走看看