zoukankan      html  css  js  c++  java
  • selenium-python学习笔记

    1.1 操作浏览器基本方法

    1.1.1 打开网页

    1.从selenium导入webdriver模块
    2.打开浏览器(Chrome、Friefox、Ie)
    3.打开网站地址

    #-*- coding:utf-8 -*-
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")

    1.1.2 设置休眠

    导入time模块,time模块是Python自带的,无需下载,设置等待时间,单位是秒(s)

    #-*- coding:utf-8 -*-
    from selenium import webdriver
    #导入time模块
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    #设置休眠时间
    time.sleep(3)

    1.1.3 页面刷新

    1.有时候页面操作后,数据可能没及时同步,需要重新刷新
    2.这里可以模拟刷新页面操作,相当于浏览器输入框后面的刷新按钮

    #-*- coding:utf-8 -*-
    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    #等待3秒刷新页面
    driver.refresh()

    1.1.4 页面切换

    1.当在一个浏览器打开两个页面后,想返回上一页面,相当于浏览器左上角的左 箭头按钮
    2.返回到上一页面后,也可以切换到下一页,相当于浏览器左上角的右箭头按钮

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.get("http://www.hordehome.com")
    time.sleep(5)
    #等待5秒返回上一页
    driver.back()
    time.sleep(3)
    等待3秒切换到下一页
    driver.forward()

    1.1.5 设置窗口大小

    1.可以设置浏览器窗口大小,如设置窗口大小为手机分辨率 540*960
    2.也可以最大化窗口

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    #设置窗口大小为540*960
    driver.set_window_size(540,960)
    time.sleep(2)
    #设置浏览器窗口最大化
    driver.maximize_window()

    1.1.6 截屏

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    #截屏并命名为“test.jpg”保存到F盘
    driver.get_screenshot_as_file("F:\test.jpg")

    1.1.7 关闭浏览器

    退出有两种方式方式:一直是close();另一种是quit()
    1)close 用于关闭当前窗口,当打开的窗口较多时,就可以用 close 关闭部分窗 口
    2)quit 用于结束进程,关闭所有的窗口

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.quit()

    1.2 常用的8种元素等位

    1.2.1 find_element_by_id()

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_id("kw").send_keys("python")

    1.2.2 find_element_by_name()

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_name("wd").send_keys("python")

    1.2.3 find_element_by_class_name()

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_class_name("s_ipt").send_keys("python")

    1.2.4 find_element_by_tag_name()

    每个元素都有 tag(标签)属性,如搜 索框的标签属性,就是最前面的 input;在一个页面中,相同的标签有很多,所以一般不用标签来定位。以下 例子,仅供参考和理解,运行肯定报错

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_tag_name("input").send_keys("python")
    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_link_text("hao123").click()
    time.sleep(3)
    driver.quit()

    有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长, 这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_partial_link_text("ao123").click()
    time.sleep(3)
    driver.quit()

    1.2.7 find_element_by_xpath()

    xpath 是一种路径语言,跟上面的定位原理不太一样,首先第一步要先学会用 工具查看一个元素的 xpath

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    # 用xpath通过id属性定位
    driver.find_element_by_xpath('//*[@id="kw"]').send_keys('Python')
    # 用xpath通过name属性定位
    driver.find_element_by_xpath('//*[@name="wd"]').send_keys('Python')
    # 用xpath通过class属性定位
    driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys('Python')
    # 用xpath通过其他属性定位属性定位
    driver.find_element_by_xpath('//*[@autocomplete="off"]').send_keys('Python')
    time.sleep(3)
    driver.quit()

    1.2.8 find_element_by_css_selector()

    .css 是另外一种语法,比 xpath 更为简洁,可以通过工具查看

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    # css通过id属性定位
    driver.find_element_by_css_selector('#kw').send_keys('Python')
    # css通过name属性定位
    driver.find_element_by_css_selector('[name='wd']').send_keys('Python')
    # css通过class属性定位
    driver.find_element_by_css_selector('.s_ipt').send_keys('Python')
    time.sleep(3)
    driver.quit()

    介绍一个firefox插件,SeleniumBuilder辅助定位元素,元素定位神器,哪里不会点哪里。

    1.3 操作元素(键盘和鼠标事件)

    1.3.1 简单操作

    1.输入字符串:send_keys()
    2.清空输入框:clear()
    3.点击事件:click()

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    time.sleep(3)
    driver.find_element_by_id("kw").send_keys("python")
    driver.find_element_by_id('su').click()
    time.sleep(2)
    driver.quit()

    1.3.2 鼠标悬停事件

    1.鼠标丌仅仅可以点击(click),鼠标还有其它的操作,如:鼠标悬停在某个元素上,鼠标 右击,鼠标按住某个按钮拖到
    2.鼠标事件需要先导入模块:from selenium.webdriver.common.action_chains import ActionChains

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    driver.implicitly_wait(5)
    #鼠标悬停在设置按钮上
    mouse = driver.find_element_by_link_text("设置")
    ActionChains(driver).move_to_element(mouse).perform()

    3.除了常用的悬停事件外,还有右击鼠标:context_click()、双击鼠标:double_click

    1.3.3 多窗口、句柄(handle )

    有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操 作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄, 我们就能在多个页面上灵活自如的操作了。

    from selenium import webdriver
    import time
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com/")
    driver.implicitly_wait(10)
    now_handle = driver.current_window_handle#获取当前窗口句柄
    print(now_handle) #输出当前获取的窗口句柄
    driver.find_element_by_id("kw").send_keys("python")
    driver.find_element_by_id('su').click()
    driver.find_element_by_xpath('//*[@id="4001"]/div[1]/h3/a[1]').click()
    time.sleep(3)
    all_handels = driver.window_handles #获取所有窗口句柄
    
    for handle in all_handels:
        if handle != now_handle:
            print(handle)#输出等待选择的窗口句柄
            driver.switch_to_window(handle)#选择新的浏览器窗口
            print(driver.title)#打印title查看是否切换成功
            time.sleep(3)
            driver.close()#关闭当前窗口
    time.sleep(2)
    print(now_handle)
    driver.switch_to_window(now_handle)#返回主窗口
    print(driver.title)#打印title查看是否切换回主窗口

    1.3.4 定位一组元素 find_elements

    from selenium import webdriver
    import random
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com/")
    driver.find_element_by_id("kw").send_keys("python")
    driver.find_element_by_id('su').submit()
    driver.implicitly_wait(10)
    s=driver.find_elements_by_css_selector('h3.t>a')
    t = random.randint(0,9)
    s[t].click()

    1.3.5 iframe

    iframe 标记又叫浮动帧标记,可以用它将一个 HTML 文档嵌入在一个 HTML 中显示。它和 Frame 标记的最大区别是在网页中嵌入 的<iframe></iframe>所包 含的内容与整个页面是一个整体,反正普通定位打死都定位不了,比如:http://mail.163.com/

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://mail.163.com/')
    driver.implicitly_wait(10)
    
    # 切换到iframe
    #driver.switch_to_frame("x-URS-iframe")
    driver.switch_to_frame(driver.find_element_by_id('x-URS-iframe'))
    driver.find_element_by_name('email').send_keys('123')
    driver.find_element_by_name('password').send_keys('456')
    #释放 iframe
    driver.switch_to.default_content()

    1.3.6 select 下拉框

    1.3.6.1 二次定位

    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    driver.get(url)
    driver.implicitly_wait(20)
    # 鼠标移动到“设置”按钮
    mouse = driver.find_element_by_link_text("设置")
    ActionChains(driver).move_to_element(mouse).perform()
    driver.find_element_by_link_text("搜索设置").click()
    # 分两步:先定位下拉框,再点击选项
    s = driver.find_element_by_id('nr')
    s.find_element_by_xpath("//option[@value='50']").click()

    1.3.6.2 直接定位

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    driver.get(url)
    driver.implicitly_wait(20)
    # 鼠标移动到“设置”按钮
    mouse = driver.find_element_by_link_text("设置")
    ActionChains(driver).move_to_element(mouse).perform()
    driver.find_element_by_link_text("搜索设置").click()
    driver.find_element_by_xpath('.//*[@id="nr"]/option[3]').click()

    1.3.6.3 通过索引定位

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    driver.get(url)
    driver.implicitly_wait(20)
    # 鼠标移动到“设置”按钮
    mouse = driver.find_element_by_link_text("设置")
    ActionChains(driver).move_to_element(mouse).perform()
    driver.find_element_by_link_text("搜索设置").click()
    # 通过索引:select_by_index()
    s = driver.find_element_by_id('nr')
    Select(s).select_by_index(2)

    1.3.6.3 Select 模块其它方法

    select_by_index() :通过索引定位
    select_by_value() :通过 value 值定位
    select_by_visible_text() :通过文本值定位
    deselect_all() :取消所有选项
    deselect_by_index() :取消对应 index 选项
    deselect_by_value() :取消对应 value 选项
    deselect_by_visible_text() :取消对应文本选项
    first_selected_option() :返回第一个选项
    all_selected_options() :返回所有的选项

    1.3.7 select alertconfirmprompt 弹框

    1.3.7.1 alert 操作

    1.先用 switch_to_alert()方法切换到 alert 弹出框上
    2.accept()点击确认按钮
    3.dismiss()相当于点右上角 x,取消弹出框

    rom selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = 'file:///C:/Users/drx/Desktop/test.html'
    driver.get(url)
    driver.find_element_by_id('alert').click()
    time.sleep(3)
    t = driver.switch_to_alert()
    t.accept()

    1.3.7.2 confirm 操作

    1.先用 switch_to_alert()方法切换到 alert 弹出框上
    2.accept()点击确认按钮
    3.dismiss()相当于点取消按钮或点右上角 x,取消弹出框

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = 'file:///C:/Users/drx/Desktop/test.html'
    driver.get(url)
    driver.find_element_by_id('confirm').click()
    time.sleep(3)
    t = driver.switch_to_alert()
    t.accept()

    1.3.7.3 prompt 操作

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = 'file:///C:/Users/drx/Desktop/test.html'
    driver.get(url)
    driver.find_element_by_id('prompt').click()
    time.sleep(3)
    t = driver.switch_to_alert()
    t.send_keys('泡面')
    time.sleep(3)
    t.accept()

    1.3.8 富文本

    定位富文本框,首先需要进行iframe切换

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    
    driver = webdriver.Chrome()
    url = 'http://www.cnblogs.com/langping/'
    driver.get(url)
    driver.implicitly_wait(20)
    driver.find_element_by_id('blog_nav_newpost').click()
    driver.find_element_by_id('input1').send_keys('用户名')
    driver.find_element_by_id('input2').send_keys('密码')
    driver.find_element_by_id('signin').click()
    driver.find_element_by_id('Editor_Edit_txbTitle').send_keys('selenium')
    driver.switch_to_frame('Editor_Edit_EditorBody_ifr') #切换到iframe
    driver.find_element_by_id('tinymce').send_keys(Keys.TAB)
    driver.find_element_by_id('tinymce').send_keys(u'哇哈哈')
    driver.switch_to_default_content() #释放 iframe
    driver.find_element_by_name('Editor$Edit$lkbDraft').click()

    1.3.9 上传文件

    driver = webdriver.Chrome()
    from selenium.webdriver.common.keys import Keys
    url = 'http://www.cnblogs.com/langping/'
    driver.get(url)
    driver.implicitly_wait(20)
    driver.find_element_by_id('blog_nav_newpost').click()
    driver.find_element_by_id('input1').send_keys('用户名')
    driver.find_element_by_id('input2').send_keys('密码')
    driver.find_element_by_id('signin').click()
    driver.find_element_by_css_selector('#Editor_Edit_EditorBody_uploadImage > span.mceIcon.mce_uploadImage > img').click()
    iframe = driver.find_elements_by_tag_name('iframe')[1] #定位所有的iframe,取第二个frmae
    driver.switch_to_frame(iframe)
    driver.find_element_by_name('file').send_keys('C:UsersdrxDesktop\abc.png')
    driver.switch_to_default_content() #释放 ifram

    1.4 获取元素属性

    通常在做断言之前,都要先获取界面上元素的属性,然后与期望结果对比。本篇 介绍几种常见的获取元素属性方法。

    1.4.1 获取页面 title

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    
    driver.get(url)
    time.sleep(2)
    title = driver.title #获取title
    print(title)

    1.4.2 获取元素的文本

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    
    driver.get(url)
    time.sleep(2)
    text = driver.find_element_by_css_selector('#lh > a:nth-child(4)').text #获取元素文本
    print(text)

    1.4.3 获取元素的标签

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    
    driver.get(url)
    time.sleep(2)
    tag = driver.find_element_by_id('su').tag_name #获取元素的标签
    print(tag
    print(text)

    1.4.4 获取元素的其它属性

    获取其它属性方法:get_attribute("属性"),这里的参数可以是 class、name 等任意属性

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    
    driver.get(url)
    time.sleep(2)
    name = driver.find_element_by_id('kw').get_attribute('name') #获取元素的name属性
    print(name)

    1.4.5 获取输入框内的文本值

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    url = "https://www.baidu.com"
    
    driver.get(url)
    time.sleep(2)
    driver.find_element_by_id('kw').send_keys(u'你大爷')
    value = driver.find_element_by_id('kw').get_attribute("value")
    print(value)

    1.4.6 获取浏览器名称

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    print(driver.name)

    虽然 cookie 相关操作在平常 ui 自动化中用得少,偶尔也会用到,比如登录有图 形验证码,可以通过绕过验证码方式,添加 cookie 方法登录

    1.5.1 获取 cookies :get_cookies()

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    # 启动浏览器后获取cookies
    print(driver.get_cookies())
    driver.get('http://www.cnblogs.com/langping/')
    # 打开主页后获取cookies
    driver.find_element_by_id('blog_nav_newpost').click()
    print(driver.get_cookies())
    
    # 登陆后获取cookies
    driver.find_element_by_id('input1').send_keys('usernam')
    driver.find_element_by_id('input2').send_keys('password')
    driver.find_element_by_id('signin').click()
    time.sleep(2)
    print(driver.get_cookies())

    1.5.2 cookie操作的几个方法

    1.get_cookies() #获取所有 cookies
    2.driver.get_cookie(name)#获取指定 name 的 cookie
    3.delete_cookie() #清除指定 cookie
    4.delete_all_cookies() #清除所有 cookies
    5.add_cookie(cookie_dict) #添加 cookie 的值

    # coding:utf-8
    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    driver.get("http://www.cnblogs.com/langping")
    # # 添加 cookie
    c1 = {u'domain': u'.cnblogs.com',
        u'name': u'.CNBlogsCookie',
        u'value': u'xxxx',
        u'expiry': 1491887887,
        u'path': u'/',
        u'httpOnly': True,
        u'secure': False}
    c2 = {u'domain': u'.cnblogs.com',
          u'name': u'.Cnblogs.AspNetCore.Cookies',
          u'value': u'xxxx',
          u'expiry': 1491887887,
          u'path': u'/',
          u'httpOnly': True,
         u'secure': False}
    driver.add_cookie(c1) # 添加 2 个值
    driver.add_cookie(c2)
    time.sleep(3)

    1.6 JS 处理滚动条

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('selenium')
    driver.find_element_by_id('su').click()
    time.sleep(2)
    # 滚动条拉到底部
    js = 'var q=document.documentElement.scrollTop=10000'
    driver.execute_script(js)
    time.sleep(2)
    # 滚动条拉到顶部部
    js = 'var q=document.documentElement.scrollTop=0'
    driver.execute_script(js)

    1.7 JS 处理日历控件

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('https://kyfw.12306.cn/otn/index/init')
    #去掉元素的readonly属性
    js = 'document.getElementById("train_date").removeAttribute("readonly");'
    driver.execute_script(js)
    #清空文本后输入值
    driver.find_element_by_id('train_date').clear()
    driver.find_element_by_id('train_date').send_keys('2017-10-10')
    一颗煤炭
  • 相关阅读:
    yum上包找不到时,用rpmsearch
    多语言国家与缩写映射表
    M_LROOT,LD_LIBRARY_PATH, “Not all extension Dlls were loaded”问题原因及解决方法(持续更新)
    android 手机信息获取
    32位和64位adb下载及安装
    basename usage in linux
    单台centos7.3 虚拟机实现主从复制和哨兵集群
    XXL-JOB分布式任务调度平台安装与部署
    MySQL5.7压缩包安装图文教程
    基于Consul+Upsync+Nginx实现动态负载均衡
  • 原文地址:https://www.cnblogs.com/langping/p/7650154.html
Copyright © 2011-2022 走看看