zoukankan      html  css  js  c++  java
  • selenium定位多个嵌套iframe

    一. driver.switch_to.frame(id):可以通过id切换到iframe

    之前学习了selenium切换到iframe的方法,代码如下

    from selenium import webdriver
    driver = webdriver.Chrome()
    
    driver.switch_to.frame(0)                #1.用frame的index来定位,第一个是0
    # driver.switch_to.frame("frame1")       #2.用id来定位
    # driver.switch_to.frame("myframe")      #3.用name来定位
    # driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 4.用WebElement对象来定位

    源码中并没有说可以通过id定位,但事实上是可以的

    二. 嵌套iframe的切换

    然而,对于嵌套的iframe,又该如何解决:

    1. index定位行不通

    当时第一点想到的是通过index定位,即第一个iframe为0,第二个为1

     1 __author__ = '小翟'
     2 
     3 from selenium import webdriver
     4 import time
     5 import os
     6 
     7 driver = webdriver.Chrome()
     8 file_path = "file:///" + os.path.abspath("frame.html")
     9 driver.get(file_path)
    10 
    11 #窗口最大化
    12 driver.maximize_window()
    13 
    14 #隐性等待30s
    15 driver.implicitly_wait(30)
    16 #先找到iframe1(id="f1")
    17 driver.switch_to.frame(0)
    18 #再找到其下面的iframe2(id="f2")
    19 driver.switch_to.frame(1)
    20 
    21 #下面就可以正常的操作元素了
    22 driver.find_element_by_id("kw").send_keys("selenium")
    23 driver.find_element_by_id("su").click()
    24 
    25 time.sleep(2)
    26 
    27 driver.quit()

    运行结果报错了,显示的第19行出错,找不到下标为1的frame

    Traceback (most recent call last):
      File "D:/python_workshop/python6/selenium_webdriver/多层框架定位.py", line 19, in <module>
        driver.switch_to.frame(1)
      File "D:Programpython34libsite-packagesseleniumwebdriver
    emoteswitch_to.py", line 89, in frame
        self._driver.execute(Command.SWITCH_TO_FRAME, {'id': frame_reference})
      File "D:Programpython34libsite-packagesseleniumwebdriver
    emotewebdriver.py", line 312, in execute
        self.error_handler.check_response(response)
      File "D:Programpython34libsite-packagesseleniumwebdriver
    emoteerrorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchFrameException: Message: no such frame
      (Session info: chrome=66.0.3359.139)
      (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 6.1.7600 x86_64)

    一定要注意,对于并列的iframe,我们可以用下标表示,但是嵌套的,除了第一个可以用下标0表示外,其他都不行

    #并列的iframe
    
    iframe ---------------------------下标0
       |
       |
       |
    iframe----------------------------下标1
       |
       |
       |
    iframe----------------------------下标2
    #嵌套的iframe
    
    iframe -----------------------------------id="f1"
    
    
        iframe ------------------------------------id="f2"
    
    
                iframe -------------------------------------id="f3"

    2. 通过id定位

    #先找到iframe1(id="f1")
    driver.switch_to.frame("f1")
    #再找到其下面的iframe2(id="f2")
    driver.switch_to.frame("f2")

    完美解决,还有一个问题,我们要向从切到上级iframe,应该如何实现

    3. 从子iframe切到父iframe

    selenium提供了一个类似"后退"的方法,如下

    driver.switch_to.parent_frame()  # 如果当前已是主文档,则无效果

    三. 总结

    对于iframe处理,目前主要有三种方法

    1 driver.switch_to.frame(reference)
    2 driver.switch_to.parent_frame()
    3 driver.switch_to.default_content()

    其中第一种iframe的切换的参数有4个: idex, id, name, webelement

    参考文章

    https://blog.csdn.net/huilan_same/article/details/52200586

  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/my_captain/p/9252884.html
Copyright © 2011-2022 走看看