• selenium 常见元素操作:三大切换--浏览器窗口切换、iframe 窗口切换、alert弹窗切换


    selenium 常见元素操作

    • 三大等待
    • 三大切换(iframe,window,alert)
    • 下拉列表
    • 鼠标和键盘
    • js+ dom应用()
    • 上传操作

    浏览器窗口切换:

    第一种:需要两步

    • 1.获取当前打开的所有窗口;window_handles(译:文斗.憨豆思)
    • 2.切换到新窗口;switch_to.window(wins[-1])(译:思维吃.图.文斗.文字)
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()     # 打开谷歌浏览器
    driver.maximize_window()        # 窗口最大化
    driver.get("https://www.baidu.com/")    # 访问百度首页
    
    driver.find_element_by_id("kw").send_keys("柠檬班")    # 定位输入框,send_keys输入内容
    driver.find_element_by_id("su").click()     # 定位 百度一下 查询按钮,进行点击click
    
    # 查询时需要等待
    loc = (By.XPATH, '//a[text()="_腾讯课堂"]')     # 需要等待的元素,进行定位
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))      # 等待上线为20秒,直到等待元素出现
    driver.find_element(*loc).click()  # 点击操作,会打开新窗口;* 代表拆包,find_element需要传入定位类型,和表达式
    
    time.sleep(2)       # 等待窗口出现,切换到新的窗口,在新窗口去操作元素。
    
    # 1.获取当前打开的所有窗口,没打开一个窗口都有一个新的句柄handles。--- 窗口列表window_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[@id="js-tab"]//h2[contains(text(),"老师")]') # 在新页面当中进行操作,等待的定位元素 WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) # 等待元素可见visibility_of_element_located driver.find_element(*loc).click() # 元素出现后进行操作 print(driver.current_window_handle) # 打印当前操作窗口句柄与上面一致 time.sleep(5) # 强制等待5秒 driver.quit() # 关闭浏览器

    第二种骚操作:这种更稳定;需要四步

    • 1.操作之前获取窗口总数1;window_handles      (译:文斗.憨豆思)
    • 2.EC条件等待新窗口出现;new_window_is_opened       (译:牛.文斗.意思.欧喷的)
    • 3.获取当前打开的所有窗口总数2;window_handles        (译:文斗.憨豆思)
    • 4.切换到新窗口;switch_to.window(wins[-1])           (译:思维吃.图.文斗(蚊子))
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()     # 打开谷歌浏览器
    driver.maximize_window()        # 窗口最大化
    driver.get("https://www.baidu.com/")    # 访问百度首页
    
    driver.find_element_by_id("kw").send_keys("柠檬班")    # 定位输入框,send_keys输入内容
    driver.find_element_by_id("su").click()     # 定位 百度一下 查询按钮,进行点击click
    
    # 查询时需要等待
    loc = (By.XPATH, '//a[text()="_腾讯课堂"]')     # 需要等待的元素,进行定位
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))      # 等待上线为20秒,直到等待元素出现
    
    # 1.点击操作之前的窗口,总数  1
    cur_handles = driver.window_handles
    driver.find_element(*loc).click()       # 点击操作,会打开新窗口
    
    # 2.EC条件:等待新窗口出现进行对比---确定新窗口个数比以前窗口多 new_window_is_opened 类
    # 将打开一个新窗口,并具有增加窗口句柄;比窗口数大小
    # 在打开新窗口后获取句柄的句柄总数与传进来的窗口数多,返回Turn 说明新窗口出现
    WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles)) # 3.获取当前打开的所有窗口。总数 2 --- 窗口列表window_handles wins = driver.window_handles print(wins) # 打印当前所有窗口的句柄 print(driver.current_window_handle) # 打印当前窗口的句柄 # 4.切换的语句,切换到你想操作元素所在的窗口;进入到了新的html页面-新的窗口为最后一个wins[-1] driver.switch_to.window(wins[-1]) loc = (By.XPATH, '//ul[@id="js-tab"]//h2[contains(text(),"老师")]') # 在新页面当中进行操作,等待的定位元素 WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) # 等待元素可见visibility_of_element_located driver.find_element(*loc).click() # 元素出现后进行操作 print(driver.current_window_handle) # 打印当前操作窗口句柄与上面一致 time.sleep(5) # 强制等待5秒 driver.quit() # 关闭浏览器

    iframe (多层HTML页面)窗口切换

    • iframe - 页面元素(容器) - 里面放的就是html
    • 切换的条件:
      • 如果你要操作的元素,在iframe当中,你才需要切换。    
    • 1、判断你要操作的元素,是否在iframe当中?
      • 得找到 iframe,才能切换到iframe当中。再去操作里面的html  
    • 2、切换:从一个html 切换到另外一个 html。

    iframe(译:哎服润么)切换,两种方式,七中方法

    方式一:支持三种方法;switch_to.frame(切换方法)  (译:思维吃.服润么)

    • 切换三种方法切换:下标切换、name名字属性切换、webelement对象切换

    方式二:更加稳定,支持四种

    • 骚操作: EC条件 - 条件:等待iframe有效并切换到iframe当中。
    • EC(译:一科四盘课题的.肯迪深思)模块中的 frame_to_be_available_and_switch_to_it(译:福软木.图.比.额为类bou.按得.思维吃.图.易特)判断方法
    • 支持四种方法切换:下标切换、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
    import time
    
    # 打开浏览器
    driver = webdriver.Chrome()
    # 访问腾讯课堂页面
    driver.get("http://www.baidu.com")
    # 窗口最大化
    driver.maximize_window()
    
    # 定位输入框,输入
    driver.find_element_by_id('kw').send_keys("腾讯课堂")       # 定位输入框,输入
    # 查询按钮定位,进行点击操作click
    driver.find_element_by_id("su").click()         # 查询按钮定位,进行点击操作click
    
    # 查询时需要等待
    # 需要等待的元素,进行定位
    loc_1 = (By.XPATH, "//div[@id='1']//a[contains(text(),'_')]")       # 需要等待的元素,进行定位
    # 等待上线为20秒,直到等待元素出现
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_1))        # 等待上线为20秒,直到等待元素出现
    
    # 点击操作之前的窗口总数   1
    a_handles = driver.window_handles       # 点击操作之前的窗口总数   1
    # 点击腾讯课堂链接
    driver.find_element(*loc_1).click()     # 点击腾讯课堂链接
    # 点击链接后会出现新窗口,需要等待
    WebDriverWait(driver, 20).until(EC.new_window_is_opened(a_handles))     # 点击链接后会出现新窗口,需要等待
    
    # 点击链接后,需要再次获取新窗口总数  2
    wins = driver.window_handles        # 点击链接后,需要再次获取新窗口总数  2
    # 切换到想要的窗口
    driver.switch_to.window(wins[-1])       # 切换到想要的窗口
    
    # 在腾讯课堂页面,定位元素,操作
    # 定位登录按钮
    loc_2 = (By.ID, 'js_login')     # 定位登录按钮
    # 等待元素可见
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_2))        # 等待元素可见
    # 在腾讯课堂页面,点击登录
    driver.find_element(*loc_2).click()     # 在腾讯课堂页面,点击登录
    
    # 定位 QQ登录 元素可见
    loc_3 = (By.XPATH, '//a[text()="QQ登录"]')
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_3))
    driver.find_element(*loc_3).click()     # 点击QQ登录
    time.sleep(1)
    
    # iframe(译:衣服润么)切换,两种方式,七中方法
    
    # 方式一:支持三种方法;switch_to.frame(译:思维吃.服润么)
    # 下标切换、name名字属性切换、webelement对象切换
    # driver.switch_to.frame("login_frame_qq")  # name属性  或
    # driver.switch_to.frame(2)         # 下标切换  或
    
    # driver.switch_to.frame(driver.find_element_by_name('login_frame_qq'))     # 或 webelement对象,需要等待下
    # 方式一的三种方法尽可能等待一下,在进行之后的操作
    #
    time.sleep(1) # 方式二:更加稳定,支持四种 # 骚操作: EC条件 - 条件:等待iframe有效并切换到iframe当中。 # EC(译:一科四盘课题的.肯迪深思)模块中的 frame_to_be_available_and_switch_to_it(译:福软木.图.比.额为类bou.按得.思维吃.图.易特)判断方法 # 支持4种切换:下标切换、name名字属性切换、webelement对象切换、元素定位元组 WebDriverWait(driver, 20).until( EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="login_frame_qq"]'))) # 等待 帐号密码登录 元素可见,进行点击操作:帐号密码登录 loc_4 = (By.ID, 'switcher_plogin') WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_4)) driver.find_element(*loc_4).click() time.sleep(1) driver.find_element_by_xpath('//input[@id="u"]').send_keys('自己的账号') # 输入账号 time.sleep(1) driver.find_element_by_xpath('//input[@id="p"]').send_keys("自己的密码") # 输入密码 time.sleep(1) driver.find_element_by_xpath('//input[@id="login_button"]').click() # 点击登录 time.sleep(4) driver.quit() # 关闭浏览器

    有多层 iframe 的 HTML 页面怎么切?如何回到主HTML页面?如何切换回上层HTML页面—— 在切一遍就好

    # 内嵌的iframe当中,还有iframe怎么处理?---同理再次使用方法切换
    driver.switch_to.frame()
    
    # 一步到位:直接回到main页面就是第一个HTML页面。
    driver.switch_to.default_content()
    
    # 切换到上层iframe的HTML页面
    driver.switch_to.parent_frame()

    弹窗切换-----会使用alert类来处理,包括:获取弹窗内文本内容、确定、取消、输入内容这四种方法

      浏览器定位时选不中弹窗,不是 弹窗 就是 windows上传文件窗口

    借用大佬总结的 javascript 的 3 种弹框:https://www.cnblogs.com/xyao1/p/7451518.html

      • 1、alert()--警告消息框,只有确认按钮
        •   
      • 2、confirm()--确认消息框,有确认和取消按钮
        •   
      • 3、prompt()--提示消息框,需要输入内容后,确认和取消按钮
        •  

    从 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()
    # 往弹框中出入文本:(译:饿了特.森的.K次)
    # alert.Send_keys()

    *******请大家尊重原创,如要转载,请注明出处:转载自:https://www.cnblogs.com/shouhu/,谢谢!!******* 

  • 相关阅读:
    mysql 分库分表
    策略模式
    JAVA NIO 选择器
    有关于web server架构的一个小疑问
    Android 吸入动画效果详解
    android中设置TextView/Button 走马灯效果
    浅谈Jquery的使用上篇
    ORA-00376:file x cannot be read at this time
    用VBA宏从一个工作薄复制内容到另一个工作薄
    ovirt node的安装简介
  • 原文地址:https://www.cnblogs.com/shouhu/p/12198988.html
Copyright © 2020-2023  润新知