zoukankan      html  css  js  c++  java
  • 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/,谢谢!!******* 

  • 相关阅读:
    【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game
    【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
    【线段树】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem J. Jedi Training
    【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word
    【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem H. Path or Coloring
    【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes
    【找规律】【递归】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem F. Doubling
    【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
    【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
  • 原文地址:https://www.cnblogs.com/shouhu/p/12198988.html
Copyright © 2011-2022 走看看