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

     

  • 相关阅读:
    CS224n, lec 10, NMT & Seq2Seq Attn
    CS231n笔记 Lecture 11, Detection and Segmentation
    CS231n笔记 Lecture 10, Recurrent Neural Networks
    CS231n笔记 Lecture 9, CNN Architectures
    CS231n笔记 Lecture 8, Deep Learning Software
    CS231n笔记 Lecture 7, Training Neural Networks, Part 2
    pytorch坑点排雷
    Sorry, Ubuntu 17.10 has experienced an internal error
    VSCode配置python插件
    tmux配置与使用
  • 原文地址:https://www.cnblogs.com/simran/p/9235853.html
Copyright © 2011-2022 走看看