zoukankan      html  css  js  c++  java
  • pythonselenium iframe、滚动条、窗口切换定位方法详解

    一、frame框架里面的元素定位

      1.1 iframe定位 -- 先切换到iframe框架-定位-释放iframe

     

    定位到iframe 3种的方法

    """
    Switches focus to the specified frame, by index, name, or webelement.
    :Args:
    - frame_reference: The name of the window to switch to, an integer representing the index,
    or a webelement that is an (i)frame to switch to.
    :Usage:
    driver.switch_to.frame('frame_name')   #通过名字
    driver.switch_to.frame(1)   #通过下标
    driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])   #通过WebElement对象来定位,如:webelement = driver.find_element_by_xpath(locator)


    """ 

     1 #切换到iframe
     2 driver.switch_to.frame("login_frame_qq")
     3 
     4 #点击账号密码登录
     5 driver.find_element_by_xpath('//a[@id="switcher_plogin"]').click()
     6 time.sleep(2)
     7 #输入账号密码
     8 
     9 #释放iframe 回到主页面
    10 driver.switch_to.default_content()

     注意:如果以上3种方法都没有办法定位到,即:iframe没有id,name等属性

    如图,可以用EC.frame_to_be_available_and_switch_to_it

    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("https://ke.qq.com/")
    driver.maximize_window()
    time.sleep(3)
    #点击登录按钮
    driver.find_element_by_id("js_login").click()
    
    #2)显性等待--切入iframe
    WebDriverWait(driver,40).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//div[@class="login-qq-iframe-wrap"]//iframe')))
    
    #点击“账号密码登录”
    driver.find_element_by_xpath('//div[@id="login"]//a[@id="switcher_plogin"]').click()
    time.sleep(5)
    
    #输入用户名密码
    driver.find_element_by_xpath('//input[@id="u"]').send_keys("59990568")
    driver.find_element_by_xpath('//input[@id="p"]').send_keys("111111")
    driver.find_element_by_xpath('//input[@value="登 录"]').click()
    time.sleep(3)
    #回到主页面
    driver.switch_to.default_content()
    time.sleep(2)
    
    driver.find_element_by_xpath('//a[@title="关闭"]//i[@class="icon-font i-close"]').click()
    time.sleep(2)
    
    driver.find_element_by_xpath('//a[@title="极速下载"]').click()
    time.sleep(5)
    driver.quit()

    二、页面滚动条之后的元素定位及窗口切换

      2.1 元素拖动到可见区域-定位

      四个常见方法:  

       1)移动到元素element对象的“底端”与当前窗口的“底部”对齐:
           driver.execute_script("arguments[0].scrollIntoView(false);",webelement)

      2)移动到元素element对象的“顶端”与当前窗口的“顶部”对齐  :
           driver.execute_script("arguments[0].scrollIntoView();",webelement)

      3)移动到页面底部:
            driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")

      4)移动到页面顶部:
           driver.execute_script("window.scrollTo(document.body.scrollHeight,
         0)") 
    ---------------------------------------------------------------------------------------------------------
      2.2 聚焦--用于输入框光标定位
    #聚焦
    driver.execute_script("arguments[0].focus();",ele_textarea)

    如:
     1 from selenium import webdriver
     2 import time
     3 from selenium.webdriver.support.wait import WebDriverWait
     4 from selenium.webdriver.support import expected_conditions as EC
     5 from selenium.webdriver.common.by import By
     6 
     7 driver = webdriver.Chrome()
     8 driver.get("https://www.baidu.com/")
     9 driver.maximize_window()
    10 time.sleep(3)
    11 
    12 #定位百度搜索框
    13 driver.find_element_by_id("kw").send_keys("python")
    14 time.sleep(3)
    15 driver.find_element_by_id("su").click()
    16 time.sleep(5)
    17 #找到这个元素
    18 ele = driver.find_element_by_xpath('//a[text()="_百度百科"]')
    19 #拖动元素到可见区域--scrollIntoView() 拉到顶部显示,有可能会被导航栏遮挡,定位不到而报错;scrollIntoView(false)可视区域底部对齐
    20 driver.execute_script("arguments[0].scrollIntoView(false);",ele)
    21 time.sleep(5)


      2.2 窗口切换   
      1)handlers = driver.window_handles #获取当前所有的窗口,是个列表
      2)driver.switch_to.window(handlers[-1]) #切换到最新打开的一个窗口
      3)driver.switch_to.window(handlers[0]) #切换到第一个窗口
      4)driver.current_window_handle() #获取当前窗口句柄(点击新开页面,非新开页面句柄,是点击前的页面句柄)

     1 #窗口切换
     2 #获取当前所有句柄 --返回的是个列表
     3 handlers = driver.window_handles
     4 ele.click()
     5 time.sleep(10)
     6 
     7 #等待新窗口打开
     8 WebDriverWait(driver,10,0.5).until(EC.new_window_is_opened(handlers))
     9 #获取当前所有句柄
    10 handlers= driver.window_handles
    11 #切换到最后一个句柄 -- 根据返回的列表下标取值
    12 driver.switch_to.window(handlers[-1])
    13 #滑动到页面最底部
    14 driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    15 driver.current_window_handle()
    16 
    17 time.sleep(5)
    18 driver.quit()

     

  • 相关阅读:
    网络测量中基于Sketch方法的简单介绍
    Reading SBAR SDN flow-Based monitoring and Application Recognition
    Reading Meticulous Measurement of Control Packets in SDN
    Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
    ovs加dpdk在日志中查看更多运行细节的方法
    后缀数组
    (转载)LCA问题的Tarjan算法
    Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar(水题)
    Vijos 1816统计数字(计数排序)
    卡特兰数
  • 原文地址:https://www.cnblogs.com/simran/p/9235853.html
Copyright © 2011-2022 走看看