• selenium自动化中的三大切换(handle窗口、iframe切换、alert弹框)


    一、handle窗口切换

    当点击某个元素后,会重新生成一个新的页签,但此时我们的操作仍然在原先的窗口当中,如果要在新的窗口继续操作元素,那么就要用到handle窗口切换的方法。

    常用方法:

    window_handles:获取当前打开的所有窗口句柄,返回类型为一个列表。

    current_window_handle:获取当前窗口的句柄。

    switch_to.window(handle_path):切换窗口,handle_path参数代表的是一个窗口句柄。

    当操作某个元素后需要等待新的元素出现,我们用到了显性等待,EC给了我们一个方法为visibility_of_element_located(),表示元素可见,那么在handle窗口切换时也涉及到等待,那就是等待新的窗口打开,我将用一般方法和新的方法来展示,具体用法如下:

    (使用time.sleep()强制等待):

    import time

    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()

    driver.get("http://www.baidu.com")

    driver.maximize_window()

    driver.find_element_by_id("kw").send_keys("python")

    driver.find_element_by_id("su").click()

    loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))

    driver.find_element(*loc).click() # 点击后新的窗口出现

    # 切换到新的窗口,在新窗口去操作元素

    time.sleep(1) # 强制等待1秒

    # 1、获取当前打开的所有窗口。--- 窗口列表。handles

    wins = driver.window_handles

    print(wins)

    # 打印打前窗口的句柄

    print(driver.current_window_handle)

    # 2、切换的语句 ,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]

    driver.switch_to.window(wins[-1])

    # 3、在新的页面当中,找元素,并操作

    loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))

    driver.find_element(*loc).click()

     

    二、iframe切换

    iframe表示在主html上嵌入的子html页面如下图所示:

    当我们要在新的html页面操作元素,就要切换到新的html页面后才能进行接下来的操作,常用方法如下:

    switch_to.frame(path):切换到新的html页面,path支持下标、name、WebElement对象三种参数

    switch_to.default_content():切换到主html页面

    switch_to.parent_frame():切换到上一层html页面(父页面)

    在iframe切换中也有等待,除了使用time.sleep()方法外,EC给了我们一个方法为frame_to_be_available_and_switch_to_it(),表示iframe有效并切换到iframe当中,它支持下标、name、WebElement对象以及元组四种方法传参。

    三、alert弹框切换

    如何区分是alert弹框呢?一个简单的方法就是无法使用元素定位的弹框,并且需要优先处理后才能操作后面的元素,常用方法如下:

    switch_to.alert:切换到alert弹框

    accept():确定

    dismiss():取消

    send_keys(keysToSend) :输入文本,keysToSend表示输入的文本内容字符串

    text():获取弹出框里面的内容

    在EC里面也给alert弹框设定了一个方法,alert_is_present()方法表示等待alert弹框出现并切换到alert弹框中

    方法一(常规做法):

    from selenium import webdriver

    driver = webdriver.Chrome()

    driver.maximize_window()

    driver.get("http://XXXX")

    # 做一个操作,导致alert框出现

    driver.find_element_by_id("idxxx").click()

    # 切换到alert弹框

    alert = driver.switch_to.alert

    # 获取alert的文本内容

    print(alert.text)

    # 点击确定,关闭弹框

    alert.accept()

    方法二(使用骚操作EC.alert_is_present()方法):

    from selenium import webdriver

    from selenium.webdriver.support.wait import WebDriverWait

    from selenium.webdriver.support import expected_conditions as EC

    driver = webdriver.Chrome()

    driver.maximize_window()

    driver.get("http://XXXX")

    # 做一个操作,导致alert框出现

    driver.find_element_by_id("idxxx").click()

    # EC条件 -- 等待alert弹框出现,并切换到alert当中

    alert = WebDriverWait(driver, 10).until(EC.alert_is_present())

    # 获取alert的文本内容

    print(alert.text)

    # 点击确定,关闭弹框

    alert.accept()

  • 相关阅读:
    delphi idhttpserver ajax 跨域解决方法
    【转】安卓apk反编译(三件套) (com.googlecode.d2j.DexException: not support version问题解决)
    C++ volatile的作用
    GetProcAddress函数
    c++ CArray函数
    CString中TrimLeft()与TrimRight()的用法
    使用Windows API进行串口编程
    SetCommMask
    AttachThreadInput
    关于CoInitialize和CoUninitialize调用的有关问题
  • 原文地址:https://www.cnblogs.com/kuaileya/p/11905363.html
Copyright © 2020-2023  润新知