zoukankan      html  css  js  c++  java
  • selenium元素操作

    简介

    找到元素后操作

    鼠标操作

    WebDriver中,关于鼠标相关操作的方法都封装在ActionChains类中。

    我们来看看ActionChains类都提供了哪些鼠标操作的方法:

    Method Description
    click(on_element=None) 鼠标左键单击
    click_and_hold(on_element=None) 鼠标左键单击,但不松开
    context_click(on_element=None) 鼠标右键单击
    double_click(on_element=None) 鼠标左键双击
    drag_and_drop(source, target) 鼠标左键单击不松开,移动到指定元素后松开(即拖拽 )
    drag_and_drop_by_offset(source, xoffset, yoffset) 鼠标左键单击不松开,移动到指定坐标后松开
    move_by_offset(xoffset, yoffset) 鼠标移动到某个坐标
    move_to_element(to_element) 鼠标移动到某个元素
    move_to_element_with_offset(to_element, xoffset, yoffset) 鼠标移动到距离某个元素的某个距离
    pause(seconds) 暂停输入
    release(on_element=None) 在某个元素松开鼠标左键
    send_keys(*keys_to_send) 在当前元素中输入值
    send_keys_to_element(element, *keys_to_send) 给某个元素输入值
    perform() 相应存储的动作
    reset_actions() 清除所有已存储的动作

    单击/双击/右键单击

    """
    通过 ActionChains 完成 单击、双击、右击
    
    练习网站:http://sahitest.com/demo/clicks.htm
    """
    
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver import ActionChains #导入类
    driver = webdriver.Chrome()
    
    try:
        driver.get('http://sahitest.com/demo/clicks.htm')
    
        # 单击
        sleep(2)
        btn1 = driver.find_element_by_xpath('/html/body/form/input[3]')
       	"""
       	# #2 实例化 类
        # ac = ActionChains(driver)
        # #3调用鼠标行为
        # ac.move_to_element(elt)
        # #4 调用perfrom执行鼠标动作
        # ac.perform()
        """
        ActionChains(driver).click(btn1).perform()
    
        # 左键双击
        sleep(2)
        btn2 = driver.find_element_by_xpath('/html/body/form/input[2]')
        ActionChains(driver).double_click(btn2).perform()
    
        # 鼠标右键单击
        sleep(2)
        btn3 = driver.find_element_by_xpath('/html/body/form/input[4]')
        ActionChains(driver).context_click(btn3).perform()
    
    finally:
        sleep(5)
        driver.quit()
    

    鼠标悬浮

    鼠标悬浮也就是将鼠标移动到某个元素上面触发的事件,那么使用selenium怎么实现呢?

    我们打开一个网站,使鼠标移动到超链接上,超链接会发生变化。

    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    
    
    
    driver = webdriver.Chrome()
    
    driver.get('https://www.cnblogs.com/saoqiang/')
    
    time.sleep(3)
    # 获取指定元素
    a = driver.find_elements_by_class_name('postTitle2')[0]
    # 移动到指定元素
    ActionChains(driver).move_to_element(a).perform()
    
    # 点击它
    time.sleep(2)
    ActionChains(driver).move_to_element(a).click().perform()
    
    
    time.sleep(5)
    driver.quit()
    

    image-20201025231856004

    滑动验证

    pass

    选择框选择

    1.1、导入的模块/类(Select)

    from selenium.webdriver.support.select import Select
    # 或
    from selenium.webdriver.support.ui import Select
    # 两者功能一样,选其一即可,没有本质的区别
    

      1.2、Select中有三种选择下拉框选择的方法   

        通过索引选择(从0开始):select_by_index(索引)
        通过属性的值(option标签的属性的值)选择:select_by_value(值)
        通过文本选择(下拉框的选项的文本):select_by_visible_text(文本)

      1.3、Select查看各个选项

        options:查看所有选项(包括已选和未选,即查看下拉框的所有选项)
        is_multiple:查看下拉框是否已经多选
        all_select_options:查看所有已选选项
        first_select_option:查看第一个已选(若有多个已选,则为第一个已选选项;单选则只有唯一一个)

    代码如下

    有select标签

    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By #引入模块
    from selenium.webdriver.common.action_chains import ActionChains      #悬浮
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(time_to_wait=10)
    driver.get("http://www.baidu.com")
    driver.maximize_window()
    
    #鼠标悬浮  其实不悬浮一样阔以找到元素点击就行
    ActionChains(driver).move_to_element(elt).perform()
    #找到高级搜索--执行点击
    driver.find_element_by_link_text('高级搜索').click()
    
    ###下面的有select选择框的选择
    from  selenium.webdriver.support.select import Select
    #找到slect选择元素
    select=driver.find_element_by_xpath('//*[@id="adv-setting-gpc"]/div')#找到select元素
    
    s = Select(select)
    #根据下标选择 根据value属性选择 文本内容选择
    s.select_by_index(6)
    time.sleep(3)
    s.select_by_value('pdf')
    time.sleep(3)
    s.select_by_visible_text('RTF文件(.rtf)')
    time. sleep(3)
    
    

    没有select标签

    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By #引入模块
    from selenium.webdriver.common.action_chains import ActionChains      #悬浮
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(time_to_wait=10)
    driver.get("http://www.baidu.com")
    driver.maximize_window()
    
    #鼠标悬浮  其实不悬浮一样阔以找到元素点击就行
    ActionChains(driver).move_to_element(elt).perform()
    #找到高级搜索--执行点击
    driver.find_element_by_link_text('高级搜索').click()
    
    #没有选择框
    xiala=driver.find_element_by_xpath('//*[@id="adv-setting-ft"]/div/div[1]')#找到上一级元素
    xiala.click()
    time.sleep(3)
    sous_list=driver.find_elements_by_css_selector('p[data-for="ft"]')#获取元素列表
    print(sous_list)
    sous_list[3].click()
    time.sleep(1)
    xiala.click()
    sous_list[1].click()
    time.sleep(1)
    xiala.click()
    sous_list[2].click()
    time.sleep(1)
    xiala.click()
    sous_list[4].click()
    time.sleep(1)
    xiala.click()
    sous_list[0].click()
    
    time.sleep(3)
    driver.quit()
    
    

    image-20201025233436263

    拖动:drag_and_drop

    所谓的拖动,也就是鼠标左键点击标签不松开,直到拖动到指定标签后再松开。

    来个jqueryui的示例。

    '''
    
    https://jqueryui.com/droppable/
    
    '''
    
    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    
    
    
    driver = webdriver.Chrome()
    driver.get('https://jqueryui.com/droppable/')
    time.sleep(3)
    
    # 因为该页面中,有iframe标签,所以先切换
    frame = driver.find_element_by_tag_name('iframe')
    driver.switch_to.frame(frame)
    
    # 获取第一个元素
    div1 = driver.find_element_by_id('draggable')
    
    # 获取第二个元素
    div2 = driver.find_element_by_id('droppable')
    
    # 拖拽
    ActionChains(driver).drag_and_drop(div1, div2).perform()
    
    time.sleep(5)
    driver.quit()
    

    再来玩个游戏

    示例代码如下:

    Copyimport time
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    
    # 获取webdriver实例
    browser = webdriver.Chrome()
    # 访问URL
    browser.get('http://www.jq22.com/demo/pintu20151229/')
    
    # 点击开始按钮,开始游戏
    time.sleep(1)
    start = browser.find_element_by_id('start')
    ActionChains(browser).move_to_element(start).click().perform()
    
    # 准备拖动,首先要找到开始和结束的两个标签
    time.sleep(2)
    img1 = browser.find_element_by_xpath('//*[@id="container"]/div[18]')  # 选中开始标签
    img2 = browser.find_element_by_xpath('//*[@id="container"]/div[18]')  # 结束标签
    ActionChains(browser).move_to_element(img1).drag_and_drop(img1, img2).perform()
    
    # 关闭浏览器
    time.sleep(3)
    browser.quit()
    # 截止2019-6-5,代码无误
    

    效果如下:

    img

    传值

    driver.find_element_by_id('kw').send_keys('pzq')
    

    上传文件

    文件操作,也就是包括上传、读取文件等操作。

    input可以输入路径的

    上传文件非常的简单,也就是在send_keys中添加上文件路径即可。

    Copyfrom selenium import webdriver
    
    driver = webdriver.Chrome()
    
    driver.get('http://127.0.0.1:8000/import_case/2')
    driver.find_element_by_name('file_obj').send_keys(r'C:UsersAnthonyDesktopa.jpg')
    driver.find_element_by_xpath('/html/body/div/div/div/form/input[3]').click()
    

    非input

    前言:

    近期很多小伙伴在使用 selenium 做 Web 自动化的过程中,遇到了文件上传的功能,发现通过 selenium 无从下手。那么小编在这里给大家整理了一篇文章,只需要几行简单的代码,就可以帮大家解决文件上传这个问题。

    文件上传窗口分析

    大家在面对文件上传这个问题的时候,无从下手的原因,主要是 selenium 无法对文件上传弹出窗口中的相关元素进行定位。以 Chrome 浏览器为例,在网页上点击上传文件,会弹出如下窗口,很显然这个弹出窗口并不是浏览器中的窗口,而是 windows 系统中的弹窗,但 selenium 只能操作浏览器,无法来操作这种系统弹窗。那么这个时候我们就需要借助于可以操作系统窗口的工具来实现。

    image.png

    728 x 630 811 x 702

    pywinauto 的使用介绍

    关于文件上传的弹窗,在 python 中可以通过 pywinauto 模块来进行操作,pywinauto 是 python 中用来做的 PC 端自动化的一个库。PC 端的所有窗口都可以使用它来进行操作。关于 pywinauto 这边不做过多介绍。之前我写过相关的文章,也录制过相关的使用视频。这里主要来讲一下如何通过它来实现文件上传。在进行文件上传的时候,我们需要这个窗口进行操作的一共是三个步骤:

    操作步骤:

    1、文件路径填写

    2、文件名填写

    3、点击打开

    在进行操作之前,我们就需要定位到这几个控件,1、路径输入框,2、文件输入框、3、打开按钮
    关于控件定位操作的具体细节,大家可以去自行学习 pywinauto 的使用
    具体定位代码如下:

      import pywinauto
    
    # 使用pywinautoc创建一个操作桌面窗口的对象
    app = pywinauto.Desktop()
    # 选中文件上传的窗口
    dlg = app["打开"]
    
    # 选中文件地址输入框
    dlg["Toolbar3"]
    
    # 选中文件名输入框
    dlg["文件名(&N):Edit"]
    
    # 选择打开按钮
    dlg["打开(&O)"]
    

    文件上传小案例

    小编事先找好了一个文件上传的地址,这边给大家来演示一个案例

    1. 第一步通过 selenium 打开文件上传的地址,点击上传文件
      from selenium import webdriver
    
    url= "https://www.layui.com/demo/upload.html"
    browser = webdriver.Chrome()
    # 访问图片上传的网页地址
    browser.get(url=url)
    # 点击图片上传按钮,打开文件选择窗口
    browser.find_element_by_xpath("//button[@id='test2']").click()
    

    上述代码执行结果如下:

    image.png

    728 x 379 1526 x 795

    1. 通过 pywinauto 选择上传文件,点击进行上传
      import pywinauto
    from pywinauto.keyboard import send_keys
    # 使用pywinauto来选择文件
    app = pywinauto.Desktop()
    # 选择文件上传的窗口
    dlg = app["打开"]
    
    # 选择文件地址输入框,点击激活
    dlg["Toolbar3"].click()
    # 键盘输入上传文件的路径
    send_keys("C:课件images")
    # 键盘输入回车,打开该路径
    send_keys("{VK_RETURN}")
    
    # 选中文件名输入框,输入文件名
    dlg["文件名(&N):Edit"].type_keys("9.png")
    
    # 点击打开
    dlg["打开(&O)"].click()
    

    多个文件上传?

    第一种方法:用循环的方式

    li=[r"I:VDownload(1).mp4",
    r"I:VDownload(2).mp4",
    r"I:VDownload(3).mp4",
    r"I:VDownload(4).mp4",
    r"I:VDownload(5).mp4",
    r"I:VDownload(6).mp4",
    ]
    for item in li:
        up = browser.find_element_by_name("loader")
        up.send_keys(item)
    

    第二种方式:构造多行字符串

    up = browser.find_element_by_name("buploader")
    item="""I:VDownload(1).mp4
    I:VDownload(2).mp4
    I:VDownload(3).mp4
    I:VDownload(4).mp4
    I:VDownload(5).mp4
    I:VDownload(6).mp4"""
    up.send_keys(item)
    

    构造字符串的时候注意去掉末尾或者开头的换行符

    获取元素宽高

    参考验证码打码
    
  • 相关阅读:
    BeautifulSoup_第一节
    第一个python爬虫——保存淘宝mm图片
    面试题:css(一)
    面试:HTML(二)
    websocket
    面试题:HTML篇(一)
    HTML5遗忘知识点(一)
    webpack热更新原理
    webpack按需加载
    什么是process.env?
  • 原文地址:https://www.cnblogs.com/saoqiang/p/13875991.html
Copyright © 2011-2022 走看看