selenium 安装

selenium 使用

1. 安装

selenium 虽然是工具,但是实际是 python 中一个库

pip install selenium==3.14

2. 浏览器驱动下载

https://googlechromelabs.github.io/chrome-for-testing/
下载后放入到 python 的 scripts 中去

from selenium import webdriver

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位到搜索框,然后输入内容
driver.find_element_by_css_selector('input[name="wd"]').send_keys("Kobe")

# 点击搜索按钮
driver.find_element_by_css_selector('input[value="百度一下"]').click()

3. xpath 选中元素

/:代表的是直接子节点
//:后代节点

4. 浏览器操作

  1. 缩放
  2. 前进和后退
  3. url
  4. 刷新
import time

from selenium import webdriver

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

time.sleep(2)   # 停顿 2s

# 设置 宽 和 高
driver.set_window_size(480, 800)

# 后退
driver.back()

time.sleep(3)

# 前进
driver.forward()

time.sleep(3)

# 刷新当前页面
driver.refresh()

5. webDriver 常见方法

import time

from selenium import webdriver

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位到搜索框,然后输入内容
search_element = driver.find_element_by_css_selector('input[name="wd"]')
search_element.send_keys("Kobe")

time.sleep(2)

search_element.clear()  # 清除先前输入的内容

time.sleep(2)
search_element.send_keys("名侦探柯南")

# 点击搜索按钮
# driver.find_element_by_css_selector('input[value="百度一下"]').click()

# 使用 summit() 提交表单
search_element.submit()

# 返回搜索框元素的大小
print(search_element.size)

time.sleep(2)
# 获取百度一下 按钮的 value 属性的值
button_element = driver.find_element_by_id("su")
button_value = button_element.get_attribute("value")
print(button_value)
# is_displayed():设置该元素能否用户可见 true / false
# 使用场景:页面弹窗(我们判断:如果弹窗可见,则需要处理弹窗)
print(button_element.is_displayed())

6. 事件

鼠标

在 WebDriver 中,将这些用于鼠标操作的方法封装在 ActionsChains 类提供。ActionChains 类提供了鼠标操作的常用方法

  • perfrom():执行所有 ActionChains 中存储的行为
  • context_click():右击
  • double():双击
  • drag_and_drop():拖动
  • move_to_element():悬停
import time

from selenium import webdriver
# 导入这个类:设置鼠标悬停操作
from selenium.webdriver.common.action_chains import ActionChains

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位到设置按钮
setting_button = driver.find_element_by_id("s-usersetting-top")

# 设置鼠标悬停
# ActionChains(打开的浏览器对象).move_to_element(悬停的元素).perform()
# perform():执行前面的操作
ActionChains(driver).move_to_element(setting_button).perform()

键盘

Keys()类提供了键盘上几乎所有按键的方法。前面了解到,send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如Ctrl+A、Ctrl+C等。

import time
from selenium import webdriver
# 导入这个类:调用键盘
from selenium.webdriver.common.keys import Keys

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位输入框
search_box = driver.find_element_by_id("kw")

# 输入内容
search_box.send_keys("seleniumm")

time.sleep(2)

# 删除多余的 m ===> 调用删除键(删除多次)
search_box.send_keys(3 * Keys.BACK_SPACE)

7. 获取断言信息(判断操作是否成功)

文本信息

import time
from selenium import webdriver
# 导入这个类:调用键盘
from selenium.webdriver.common.keys import Keys

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位搜索框
search_box = driver.find_element_by_id('kw')

# 输入内容
search_box.send_keys("张无忌")

# 调用回车键
search_box.send_keys(Keys.ENTER)

# 多个元素存在一个列表中【内部有双引号,所以外层要用单引号】
titles =  driver.find_elements_by_xpath('//div[@id="content_left"]//div/h3/a')

print(titles)

# 由于是一个列表,要获取内容,遍历
for t in titles:
     # 获取文本内容
     print(t.text)

Title 信息

import time
from selenium import webdriver
# 导入这个类:调用键盘
from selenium.webdriver.common.keys import Keys

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位搜索框
search_box = driver.find_element_by_id('kw')

# 输入内容
search_box.send_keys("张无忌")

# 调用回车键
search_box.send_keys(Keys.ENTER)
time.sleep(3)
# 获取网页标题
print(driver.title)

URL 地址

# 获取网页标题
print(driver.current_url)

获取到 url

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%BC%A0%E6%97%A0%E5%BF%8C&fenlei=256&rsv_pq=0x997eb7990021a701&rsv_t=425bY%2FmKOMc%2BzQwNSW4VXk6tqy9HOYhg2famtRzdXxJAgKIsRyreFyE2x1Jy&rqlang=en&rsv_enter=1&rsv_dl=tb&rsv_sug3=3&rsv_sug2=0&rsv_btype=i&inputT=56&rsv_sug4=56

8. 设置元素等待

为了解决页面加载太慢,而代码执行过快,元素定位不到的问题

强制等待

time.sleep(3)

隐式等待

# 隐式等待
针对后面所有页面都有效:判断如果某个元素没有加载出来,最大超时时间为:10s
driver.implicitly_wait(10)

显示等待

显示等待设置的时候,需要给每一个元素单独设置,偶尔有一个元素,由于=业务需要加载时间比较长,则可以单独设置显示等待

import time
from selenium import webdriver
# 在显示等待的时候,元素定位方式需要使用 By 加载
from selenium.webdriver.common.by import By
# 设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位搜索框
search_box = driver.find_element_by_id('kw')

#  def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
# 1. 最大超时时间
# 2. 轮询时间
# 5s 内,每隔 0.5s 去加载一次:如果超过 5s 还没加载出来,则报错
# EC.presence_of_all_elements_located(By.ID):接受的是元素定位方式和具体的表达式,要使用元组的形式传入
WebDriverWait(driver, 5, 0.5).until(EC.presence_of_all_elements_located((By.ID, 'kw')))

# 输入内容
search_box.send_keys("hello")

# 设置提交
search_box.submit()

9. 多窗口切换

浏览器打开的窗口其实会有一个叫做句柄的概念。句柄类似于一个标签页的 id 一样,是唯一的

import time
from selenium import webdriver
# 在显示等待的时候,元素定位方式需要使用 By 加载
from selenium.webdriver.common.by import By
# 设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("http://www.baidu.com")

# 定位搜索框
search_box = driver.find_element_by_id('kw')

# 输入内容
search_box.send_keys("马蓉")

# 设置提交
search_box.submit()

# 获取标签页句柄
window_handle1 = driver.current_window_handle
print(window_handle1)    # 9D4E36A3CFF6FF82C0572BE52F4F73A5

# 点击百度百科
driver.find_element_by_xpath('//*[@id="1"]/div/h3/a').click()

# 强制等待
time.sleep(3)

# 获取当前浏览器的所有窗口的句柄
handles = driver.window_handles
print(handles) # 列表 ['9D4E36A3CFF6FF82C0572BE52F4F73A5', '691D4F289DB96E5A67A357E3869D4B42']

# 根据句柄进行切换【切换到列表中最新的】
driver.switch_to.window(handles[-1])    

# 再点击编辑按钮
driver.find_element_by_xpath('//*[@id="J-lemma-main-wrapper"]/div[2]/div/div[1]/div/div[2]/div[1]/div/a[1]').click()

10. iframe表单切换

某个元素的属性是无序的字母或者数字时,那么这个属性是不能用的
我们要获取 iframe,但是没有可用的id,所以先选择上层的 div

import time
from selenium import webdriver
# 在显示等待的时候,元素定位方式需要使用 By 加载
from selenium.webdriver.common.by import By
# 设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 打开网页
driver.get("https://mail.163.com/")

# 使用 xpath 方式定位 iframe 标签
iframe_element = driver.find_element_by_xpath('//*[@id="loginDiv"]/iframe')
# 切换
driver.switch_to_frame(iframe_element)
time.sleep(3)
# 用户名
driver.find_element_by_name('email').send_keys('David')
# 密码
driver.find_element_by_name('password').send_keys('11112233')
# 点击登录
driver.find_element_by_id('dologin').click()

# 由于登陆时,邮箱和密码,是在内存子页面中,所以通过 iframe 已经切换进去了,而 VIP 又在最外层页面 ===>
# 快速切换到最外层
driver.switch_to_default_content()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[2]/div[2]/a[3]').click()

11. 警告框处理 alert

使用 JS 实现的 alert 警告框,使用元素定位的方式无法定位

注意:操作时候,首先要切换到 alert 弹窗

切换到 alert 弹窗
alter_obj = driver.switch_to.alert
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>警告窗口操作</title>
    <script type="text/javascript">
         function alertButton() {
        alert('我是普通的alert提示框');
    };

    function confirmButton() {
        var msg = confirm('点击[确定]或者[取消]按钮');
        if (msg) {
            alert('你点击的是[确定按钮]');
        } else {
            alert('你点击的是[取消按钮]');
        }
    };

    function promptButton() {
        var msg = prompt('输入一个值:', '我是默认值');
        if (msg) {
            alert('输入的值为:\n' + msg);
        } else {
            alert('输入值为空');
        }
    };
    </script>
</head>
<body>
<!-- 静态注册 -->
<button onclick="alertButton()">我只是一个普通的按钮</button>
<button onclick="confirmButton()">具有确定和取消按钮</button>
<button onclick="promptButton()">具有确定和取消按钮(可以输入内容)</button>

</body>
</html>

普通的 alter 弹窗

import os
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)

# 打开网页
driver.get(filePath)

# 1. 操作普通弹窗
driver.find_element_by_xpath('/html/body/button[1]').click()
time.sleep(1)
# 2. 切换到 alert 弹窗
alter_obj = driver.switch_to.alert
# 3. 获取弹窗文本信息
print(alter_obj.text)
# 4. 点击弹窗确认按钮
time.sleep(2)
alter_obj.accept();

confirm弹窗

import os
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)

# 打开网页
driver.get(filePath)

# 1. 操作普通弹窗
driver.find_element_by_xpath('/html/body/button[2]').click()
time.sleep(1)
# 2. 切换到 alert 弹窗
alter_obj = driver.switch_to.alert
# 3. 获取弹窗文本信息
print(alter_obj.text)
# 4. 点击弹窗确认 / 取消 按钮
time.sleep(2)
# alter_obj.accept();
alter_obj.dismiss();
alter_obj.accept();

promote 弹窗

import os
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)

# 打开网页
driver.get(filePath)

# 1. 操作普通弹窗
driver.find_element_by_xpath('/html/body/button[3]').click()
time.sleep(1)
# 2. 切换到 prompt 弹窗
prompt_obj = driver.switch_to.alert
# 3. 输入内容
time.sleep(3)
prompt_obj.send_keys("Joker")

# 4. 点击确认按钮
prompt_obj.accept()
prompt_obj.accept()

12. 下拉选择框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下拉选择框</title>
</head>
<body>
    <select name="myselect">
        <!--·vQ(ue属性的值在下拉选择框的选项中一般是唯一的·-->
        <option value="o0">-------</option>
        <option value="o1">谷歌搜索</option>
        <option value="o2">百度搜索</option>
        <option value="o3">搜狗搜索</option>
        <option value="o4">bing搜索</option>
        <option value="o5">360搜索</option>
    </select>
</body>
</html>

解决方式:

import os
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)

# 打开网页
driver.get(filePath)

# 1. 先进行类的实力话,传入下拉选择框的对象
select_obj = Select(driver.find_element_by_xpath('/html/body/select'))

# 方式一:索引(从 0 开始)
# select_obj.select_by_index(3)

# 方式二:value 属性值
# select_obj.select_by_value('o4')

# 方式三: 通过文本选择
select_obj.select_by_visible_text('搜狗搜索')

13. 文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet"/>
<body>
<div class="row-fluid">
    <div class="span6 well">
        <h3>upload_file</h3>
        <input type="file" name="file"/>
    </div>
</div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</html>
import os
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)

# 打开网页
driver.get(filePath)

# 1. 选择文件上传的 input 标签
driver.find_element_by_xpath('/html/body/div/div/input').send_keys("E:\\桌面\\3123.txt")

14. 关闭浏览器

  • close():关闭页面
  • quit():关闭浏览器
import os
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 打开一个浏览器
driver = webdriver.Chrome()

# 设置浏览器最大化
driver.maximize_window()

# 隐式等待
driver.implicitly_wait(10)

# 由于是直接打开 html 页面,需要路径拼接
driver.get("http://www.baidu.com")

time.sleep(2)

driver.find_element_by_xpath('//*[@id="s-top-left"]/a[2]').click()

time.sleep(2)
# driver.close() # 如果浏览器有多个标签页面,则会关闭第一个标签页面(只有一个页面时候才会关闭浏览器)

driver.quit()   # 关闭所有
posted @ 2024-01-22 00:41  爱新觉罗LQ  阅读(29)  评论(0编辑  收藏  举报