欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Selenium常用操作

程序员文章站 2022-03-18 14:07:34
目录 安装 下载驱动 元素选取 输入、清除、点击 关闭窗口、浏览器 窗口切换 页面(frame)切换 页面弹窗 等待加载 动作链 键盘事件 执行js(滑动滚动条) 截图 获取元素属性 获取网页源代码、刷新页面 设置窗口大小 设置代理、UA Cookie操作 跳过Selenium检测 示例 安装 元素 ......

目录

安装

pip install selenium



元素选取

单个元素查找方法

  • 注: 其中的element加上一个s,则是对应的多个元素的查找方法

  • 通过xpath查找
    • find_element_by_xpath()
  • 通过id查找
    • find_element_by_id()
  • 通过class属性查找
    • find_element_by_class_name()
  • 通过css选择器查找 ( 语法规则
    • find_element_by_css_selector()
  • 通过链接文本查找
    • find_element_by_link_text()
  • 通过链接文本的部分匹配查找
    • find_element_by_partial_ink_text()
  • 通过name属性进行查找
    • find_element_by_name()
  • 通过标签名查找
    • find_element_by_tag_name()

两种方法集成了上面所有的查找方法

find_element(by.id, '...')

  • 通过id查找一个

find_elements(by.xpath, '...')

  • 通过xpath查找多个

by.xxx 选择使用的查找方法,使用xxx方式解析

  • by对象导入: from selenium.webdriver.common.by import by

    Selenium常用操作



输入、清除、点击

  • 输入内容
    • send_keys('内容')
  • 清除内容
    • clear()
  • 点击
    • click()



关闭窗口、浏览器

  • 关闭当前句柄窗口(不关闭进程)
    • close()
  • 关闭整个浏览器进程
    • quit()



窗口切换

用selenium操作的是第一个打开的窗口,新打开的窗口是无法直接去操作的

需要切换窗口的句柄

  • 获取所有窗口的句柄
    • window_handles
      • window_handles的顺序并不是浏览器上窗口的顺序
  • 获取当前窗口的句柄
    • current_window_handle
  • 切换句柄到指定的窗口
    • switch_to.window( window_handles[1] )



页面(frame)切换

iframe标签 通常出现在登录页面

  • 切到指定frame,可用id、name、元素定位
    • switch_to.frame()
  • 切到父级frame,如果已是主文档,则无效果,相当于后退回去
    • driver.switch_to.parent_frame()
  • 切换到主页面,dom树最开始的frame
    • driver.switch_to_default_content()



页面弹窗

  • 定位到alert弹窗,返回一个弹窗的对象
    • switch_to.alert
  • 对弹窗对象的取消操作(相当于点击弹窗上的取消按钮)
    • dismiss()
  • 对弹窗对象的确定操作(相当于点击弹窗上的确定按钮)
    • accept()
  • 对弹窗对象内的输入框输入数据(针对于prompt弹窗)
    • send_keys(key)
  • 获取弹窗内的文本
    • text



等待加载

导入webdriverwait

  • from selenium.webdriver.support.wait import webdriverwait

导入expected_conditions

  • from selenium.webdriver.support import expected_conditions as ec

显式等待

  • 指定某个条件,然后设置最长等待时间,每隔一定时间检查一次(默认0.5秒)
  • 如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常:timeoutexception
  • webdriverwait(driver, timeout, poll_frequency,igonred_exceptions).until(method, message)
    • driver:webdriver的实例
    • timeout: 等待的最长时间
    • poll_frequency:调用until中的方法的间隔时间,默认0.5秒
    • igonred_exceptions:忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待

等待条件:expected_conditions

  • 这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(by.id, 'kw'),一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
    • presence_of_element_located    (这个用的次数最多)
    • presence_of_all_elements_located
  • 这两个条件类验证title,验证传入的参数title是否等于或包含于driver
    • title_is
    • title_contains
  • 这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入webelement
    • visibility_of_element_located
    • invisibility_of_element_located
    • visibility_of
  • 判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
    • text_to_be_present_in_element
    • text_to_be_present_in_element_value
  • 判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或webelement
    • frame_to_be_available_and_switch_to_it
  • 判断是否有alert出现
    • alert_is_present
  • 判断元素是否可点击,传入locator
    • element_to_be_clickable

隐式等待

  • 设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步
  • 隐性等待对整个driver的周期都起作用,所以只要设置一次即可,默认等待时间为0
  • driver.implicitly_wait(10) #隐式等待,最长10s
  • 弊端
    • 程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待
    • 也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步

隐性等待和显性等待可以同时用,等待的最长时间取两者之中的最大者




动作链

导入actionchains:from selenium.webdriver.common.action_chains import actionchains

  • 执行链中的所有动作
    • perform()
  • 点击鼠标左键,按住不放
    • click_and_hold(on_element=none)
  • 在某个元素位置松开鼠标左键
    • release(on_element=none)
  • 移动鼠标到指定的x,y位置
    • move_by_offset(xoffset, yoffset)
  • 将鼠标移动到距某个元素多少距离的位置
    • move_to_element_with_offset(to_element, xoffset, yoffset)
  • 拖拽到某个元素然后松开
    • drag_and_drop(source, target)
  • 拖拽到某个坐标然后松开
    • drag_and_drop_by_offset(source, xoffset, yoffset)
  • 鼠标移动到某个元素
    • move_to_element(to_element)
  • 双击鼠标左键
    • double_click(on_element=none)
  • 单击鼠标右键
    • context_click(on_element=none)
  • 鼠标左键单击传入的元素
    • click(on_element=none)




键盘事件

keys对象导入:from selenium.webdriver.common.keys import keys

  • 删除键(backspace)
    • send_keys(keys.backspace)
  • 空格键(space)
    • send_keys(keys.space)
  • 制表键(tab)
    • send_keys(keys.tab)
  • 回退键(esc)
    • send_keys(keys.escape)
  • 回车键(enter)
    • send_keys(keys.enter)
  • 全选(ctrl+a)
    • send_keys(keys.control,'a')
  • 复制(ctrl+c)
    • send_keys(keys.control,'c')
  • 剪切(ctrl+x)
    • send_keys(keys.control,'x')
  • 粘贴(ctrl+v)
    • send_keys(keys.control,'v')
  • 键盘 f1
    • send_keys(keys.f1)
  • 键盘 f12
    • send_keys(keys.f12)



执行js

  • execute_script( js语句 )



截图

  • get_screenshot_as_file('***.png')



获取元素属性

  • 获取元素标签上的属性
    • get_attribute('href')
  • 元素的坐标
    • location
  • 元素的大小
    • size



获取网页源代码、刷新页面

  • 网页源代码
    • page_source
  • 刷新页面
    • refresh()



设置窗口大小

  • 最小化
    • minimize_window()
  • 最大化
    • maximize_window()
  • 设置窗口具体的大小
    • set_window_size(width,height)
  • 设置窗口位置
    • set_window_position(x,y)



设置代理、ua

  • 设置代理
    • webdriver.chromeoptions().add_argument('--proxy-server=http://ip:port')
  • 设置ua
    • webdriver.chromeoptions().add_argument('user-agent=ua')
  • "="两边不能有空格



cookie操作

  • 获取cookie
    • get_cookies()
  • 添加cookie
    • add_cookie()
    • 添加cookie前需要先打开任意一个网页
    • 否则会报错:invalidcookiedomainexception: message: invalid cookie domain
  • 删除cookie
    • delete_all_cookies()
  • cookie键名
    • name:cookie的名称
    • value:cookie对应的值
    • domain:服务器域名
    • expiry:cookie有效终止日期
    • path:path属性定义了web服务器上哪些路径下的页面可获取服务器设置的cookie
    • httponly:防脚本攻击
    • secure:规定cookie只能在https协议下才能够发送到服务器



跳过selenium检测

window.navigator.webdriver

  • 普通浏览器,js 中,window.navigator.webdriver 为 undefined
  • selenium ,js 中,window.navigator.webdriver 为 true
  • 使用
    • webdriver.chromeoptions().add_experimental_option('excludeswitches', ['enable-automation'])



示例

执行js、窗口切换、关闭窗口、关闭浏览器

import time
from selenium import webdriver

driver = webdriver.chrome()
try:
    driver.get("http://news.baidu.com/")
    print('执行js打开新窗口前')
    print('所有窗口的句柄:', driver.window_handles)
    print('当前窗口的句柄:', driver.current_window_handle)
    # 执行js打开新窗口
    new_js = 'window.open("https://www.toutiao.com/")'
    driver.execute_script(new_js)
    print('执行js打开新窗口后')
    all_handle = driver.window_handles
    print('所有窗口的句柄:', all_handle)
    print('当前窗口的句柄:', driver.current_window_handle)
    print('切换句柄...')
    driver.switch_to.window(all_handle[1])
    print('当前窗口的句柄:', driver.current_window_handle)

    # 页面高度
    height = 0
    # 执行js滑动滚动条
    while height < 10000:
        # 滑动滚动条到指定位置
        driver.execute_script('document.documentelement.scrolltop=10000')
        # 页面高度
        height = driver.execute_script('return document.body.scrollheight')
        
    time.sleep(2)
    # 关闭新打开的窗口
    driver.close()
finally:
    time.sleep(3)
    # 关闭浏览器
    driver.quit()

Selenium常用操作


登录qq空间:frame切换、输入内容、清除内容、点击、键盘事件

import time
from selenium import webdriver
from selenium.webdriver.common.by import by
from selenium.webdriver.common.keys import keys

driver = webdriver.chrome()
try:
    driver.get("https://qzone.qq.com/")
    time.sleep(0.5)
    """通过元素定位,切到指定frame(登录框)
    frame = driver.find_element(by.xpath,'//iframe')
    driver.switch_to.frame(frame)
    """
    # 也可通过 id 或 name 定位 frame
    driver.switch_to.frame('login_frame')
    # 点击  帐号密码登录
    driver.find_element(by.link_text, '帐号密码登录').click()
    time.sleep(0.5)
    text_box = driver.find_element(by.id, 'u')
    # 输入内容
    text_box.send_keys('0123456789')
    time.sleep(1)
    # 清除内容
    text_box.clear()
    time.sleep(1)

    text_box.send_keys('正确的账号')
    password_box = driver.find_element(by.css_selector, '.inputstyle.password')
    password_box.send_keys('正确的密码')
    time.sleep(1.5)

    # 执行键盘操作:回车键
    password_box.send_keys(keys.enter)
    time.sleep(7)

finally:
    time.sleep(3)
    # 关闭浏览器
    driver.quit()



页面弹窗、截图、获取元素属性

import time
from selenium import webdriver

driver = webdriver.chrome()
try:
    driver.get("https://www.baidu.com/")
    time.sleep(0.3)
    driver.find_element_by_link_text('设置').click()
    time.sleep(0.3)
    driver.find_element_by_link_text('搜索设置').click()
    time.sleep(0.3)
    driver.find_element_by_link_text('保存设置').click()
    time.sleep(1)
    #   获取弹窗的对象
    alert_box = driver.switch_to.alert
    #   获取弹窗的内容
    print('弹窗内容:',alert_box.text)
    #   对弹窗对象的确定操作
    alert_box.accept()

    #   按钮:百度一下
    button = driver.find_element_by_css_selector('[type="submit"]')
    #   获取元素标签上的属性
    print('get_attribute:', button.get_attribute('value'))
    #   元素的坐标
    print('location:', button.location)
    #   元素的大小
    print('size:', button.size)

    #   截图
    driver.get_screenshot_as_file('1.png')


finally:
    time.sleep(3)
    # 关闭浏览器
    driver.quit()



设置窗口大小、获取网页源代码、刷新页面

import time
from selenium import webdriver

driver = webdriver.chrome()
try:
    driver.get("https://www.toutiao.com/")
    time.sleep(1)
    # 最小化
    driver.minimize_window()
    time.sleep(1)
    # 设置窗口具体的大小
    driver.set_window_size(500,500)
    time.sleep(1)
    # 设置窗口位置
    driver.set_window_position(800,200)
    time.sleep(1)
    # 最大化
    driver.maximize_window()
    time.sleep(1)
    # 打印网页源码(js渲染过的)
    print(driver.page_source)
    # 刷新当前页面
    driver.refresh()

finally:
    time.sleep(3)
    # 关闭浏览器
    driver.quit()



cookie操作

import time
import json
from selenium import webdriver

driver = webdriver.chrome()

try:
    driver.get('https://www.cnblogs.com/')

    """获取cookie
    # 等待60秒用于手动登录
    time.sleep(60)
    # 保存获取到的cookie
    cookies = driver.get_cookies()
    
    with open('1.txt', 'w+') as f:
        f.write(json.dumps(cookies))
    """



    """添加cookie
    
    with open('1.txt') as f:
        cookies = json.loads(f.read())

    # 添加cookie前需要先打开任意一个网页
    # 然后再进行添加
    # 否则会报错:invalidcookiedomainexception: message: invalid cookie domain
    for cookie in cookies:
        driver.add_cookie(cookie)
    # 添加完毕后,再打开对应网页,便是已登录状态
    driver.get('https://www.cnblogs.com/')
    time.sleep(5)
    """



    """清空cookie
    driver.delete_all_cookies()
    # 清空cookie后是未登录的状态
    driver.get('https://www.cnblogs.com/')
    """

finally:
    time.sleep(3)
    driver.quit()



设置代理、ua

import time
from selenium import webdriver

opt = webdriver.chromeoptions()
#   设置代理
opt.add_argument('--proxy-server=http://121.40.162.239:808')
#   设置ua
opt.add_argument('user-agent=abcdefg')

driver = webdriver.chrome(options=opt)

try:
    driver.get('http://httpbin.org/get')

finally:
    time.sleep(3)
    driver.quit()

Selenium常用操作



等待加载

import time
from selenium import webdriver
from selenium.webdriver.common.by import by
from selenium.webdriver.support.wait import webdriverwait
from selenium.webdriver.support import expected_conditions as ec

driver = webdriver.chrome()
try:
    driver.get('https://www.python.org/getit/')
    
    # 显式等待的等待条件  -->  参数为数组类型
    method = ec.presence_of_element_located((by.link_text, 'downloads'))
    # 显式等待
    webdriverwait(driver, 20, 0.2).until(method)
    # 隐式等待
    # driver.implicitly_wait(20)
    
    driver.find_element(by.link_text, 'downloads').click()

finally:
    time.sleep(10)
    driver.quit()



动作链

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import actionchains

driver = webdriver.chrome()
try:
    driver.get('http://www.treejs.cn/v3/demo/cn/exedit/drag.html')
    time.sleep(2)
    
    # 定位元素
    element = driver.find_element_by_id('treedemo_2_span')
    target = driver.find_element_by_id('treedemo_12_span')

    #   动作链:拖拽
    actionchains(driver).drag_and_drop(element,target).perform()

finally:
    time.sleep(10)
    driver.quit()



跳过selenium检测

import time
from selenium import webdriver

opt = webdriver.chromeoptions()
opt.add_experimental_option('excludeswitches', ['enable-automation'])
driver = webdriver.chrome(options=opt)
try:
    driver.get('http://www.baidu.com')
finally:
    time.sleep(10)
    driver.quit()

Selenium常用操作