基于Python的Selenium详细教程

一、PyCharm安装配置Selenium

本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0
需要你懂的技术:Python、HTML、CSS、JavaScript

1.Seleium安装:

在PyCharm终端或window命令窗口输入以下命令

 #查看已安装的Python包(可跳过)
 pip list
 #安装selenium 4.3.0
 pip install selenium==4.3.0

注意:在window命令窗口安装时,首先要确保Python环境变量配置正确

 ##卸载Selenium命令
 pip uninstall selenium

2.配置浏览器驱动

  • 下载浏览器驱动
    这里给出各浏览器(Chrome、Firefox、Edge等)的驱动下载地址,Edge驱动,Chrome(谷歌)驱动,Firefox(火狐)驱动,自行下载所需浏览器驱动。
  • 将下载好的浏览器驱动放置在Python安装目录下(即Python环境变量配置目录)
    在这里插入图片描述

3. 验证

在PyCharm中新建一个Python文件,自行命名,输入以下代码:

import time
# 导入selenium包
from selenium import webdriver
# 打开Firefox浏览器
browser = webdriver.Firefox()
# 停留三秒
time.sleep(3)
# 关闭浏览器
browser.quit()

执行后,Firefox浏览器将被打开,证明Selenium安装配置完成

  • 启动Chrome浏览器
# 打开Chome浏览器
browser = webdriver.Chrome()
# 关闭浏览器
browser.quit()
  • 启动Edge浏览器
# 打开Edge浏览器
browser = webdriver.Edge()
# 关闭浏览器
browser.quit()

二、Selenium使用

2.1、加载指定页面并关闭

import time
# 导入selenium包
from selenium import webdriver
# 打开指定(Firefox)浏览器
browser = webdriver.Firefox()
# 指定加载页面
browser.get("http://www.csdn.net/")
# 设置五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()

2.2 、元素定位

元素定位方法包含了2个系列:

  • find_element()系列:用于定位单个的页面元素。
  • find_elements()系列:用于定位一组页面元素,获取到的是一组列表。

1、通过标签id属性定位

  • find_element(By.ID,'XX')id定位,根据元素的id属性值定位,最为方便且唯一,但有可能不存在,也可能动态生成。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开指定(Firefox)浏览器
browser = webdriver.Firefox()
# 指定加载页面
browser.get("http://www.csdn.net")
# 通过id属性获取搜索输入框
input_text = browser.find_element(By.ID, "toolbar-search-input")
# 向搜索输入框内输入selenium
input_text.send_keys("selenium")
# 设置停留五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()

2、通过标签name属性定位

  • find_element(By.NAME,'xx')name定位,根据元素的name属性值定位,定位到的标签不一定是唯一的。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.baidu.com/")
# 通过name属性选择文本框元素,并设置内容
browser.find_element(By.NAME,'wd').send_keys("selenium")
# 通过通过ID属性获取“百度一下”按钮,并执行点击操作
browser.find_element(By.ID,"su").click()
# 停留五秒后关闭浏览器
time.sleep(5)
browser.quit()

3、通过标签class属性定位

  • find_element_by(By.CLASS_NAME,'xx')class定位,根据元素的class属性值定位,但可能受JS影响动态变化。定位到的标签不一定是唯一的。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.baidu.com/")
time.sleep(2)
# 通过class属性选择元素
browser.find_element(By.CLASS_NAME,'s_ipt').send_keys("CSDN")
time.sleep(2)
browser.find_element(By.ID,"su").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

4、通过标签tag定位

  • find_element(By.TAG_NAME,'xx')tag name定位,根据元素的标签名定位,定位到的标签不一定是唯一的。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
time.sleep(2)
# 选择<button></button>标签(搜索按钮),执行点击操作
browser.find_element(By.TAG_NAME, "button").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

5、通过link定位

  • link表示包含有属性href的标签元素,如:<a href="https://www.csdn.net">linktext</a>可以通过LINK_TEXT进行定位。
  • find_element(By.LINK_TEXT,'XX')根据链接文本全匹配进行精确定位。
  • find_element(By.PARTIAL_LINK_TEXT,'XX')根据链接文本模糊匹配进行定位。

(1)、By.LINK_TEXT精确定位

import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 选择<a href="https://blog.csdn.net/nav/back-end">Python</a>标签,执行点击操作
browser.find_element(By.LINK_TEXT, "Python").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

(2)By.PARTIAL_LINK_TEXT模糊定位

import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 选择<a href="href="https://blog.csdn.net/nav/ai">人工智能</a>标签,执行点击操作
browser.find_element(By.PARTIAL_LINK_TEXT, "人工").click()
# 停留五秒后关闭浏览器
time.sleep(3)
browser.quit()

6、通过元素的xpath定位

xpath是一种在XML文档中定位元素的语言

  • 使用绝对路径定位
    指的是从网页的HTML代码结构的最外层一层层的写到需要被定位的页面元素为止。
    绝对路径起始于/,每一层都被/所分割。
    /html/body/div[2]/form/input[3]
    注解:
    (1)可以用中括号选择分支,div[2]代表的是当前层级下的第二个div标签;
    (2)一般情况下较少使用绝对路径的方式做定位,原因在于绝对路径的表达式一般太长,不便于后期的代码维护,代码的微小改变就可能导致这个路径失效,从而无法完成元素定位。

  • 使用相对路径定位
    不是从根目录写起,而是从网页文本的任意目录开始写。
    相对路径起始于//,//所表示的含义是“任意标签下”
    //input[@id='kw']
    注解:
    (1)示例的含义:在当前页面查找任意目录下的input元素,且该元素的id属性取值为kw
    (2)在xpath里,属性以@开头
    (3)所选取的属性可以是任意属性,只要其有利于标识这个元素即可
    (4)推荐使用相对路径结合属性的这种xpath表达式,它往往更简洁更易于维护
    (5)有时候可能会出现一个属性不足以标识某个元素,可以使用逻辑运算符and来连接多个属性进行标识。//input[@xx='aa' and @yy='bb']
    (6)有时候一个元素它本身没有可以唯一标识它的属性,这时我们可以找它的上层或者上上层, 然后再往下写。//input[@xx='aa']/p

  • find_element(By.XPATH,'XX')根据元素的xpath表达式来完成定位,可以准确定位任何元素。

表达式描述
nodename选取此节点的所有子节点
/从当前节点选取直接子节点
//从当前节点选取子孙节点
.选取当前节点
..选取当前节点的父节点
@选取属性
*选取属性

打开CSDN首页,按F12进入开发者模式,我们可以按照下图所示获取元素的xpath路径,我这里定位的是搜索框的xpath。
在这里插入图片描述
点击后会存在与剪切板中,Ctrl+v粘贴到代码中即可使用,这里获取到的是相对路径。

import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By

# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 通过xpath定位输入框,输入内容selenium
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium')
# 停留五秒后关闭浏览器
time.sleep(5)
browser.quit()

7、通过css选择器定位

  • find_element(By.CSS_SELECTOR,'XX')根据元素的css选择器来完成定位,可以准确定位任何元素,但需要熟练掌握css选择器
  • css选择器
    (1)类选择器--------.XXX选择class属性为xxx的元素
    (2)id选择器-------- #XXX选择id属性为xxx的元素
    (3)元素选择器-----XXX选择标签名为xxx的元素
    (4)属性选择器-----[yyy='bbb']选择yyy属性取值为bbb的元素
    (5)派生选择器-----AA>XXAA XX选择AA标签下的XX元素
  • 你可以通过获取xpath的方式来从页面获取css选择器
    css里标识层级关系使用的是>或者空格xpath里使用的是/
    div#xx1>input.yy2

注意:对于css的属性值来说,可以加引号也可以不加,注意属性的引号和整个CSS表达式的引号要进行区分。对于xpath的属性值来讲,需要加上引号,否则报错。

import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 通过css选择器定位输入框,输入内容selenium
browser.find_element(By.CSS_SELECTOR, '#toolbar-search-input').send_keys('selenium')
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

8、几种元素定位方式区别

定位方式定位是否唯一返回值类型备注
id属性定位唯一element只有当标签有id 属性时才能使用
name属性定位可能不唯一element或
elements列表
只有当标签有name 属性时才能使用
class属性定位可能不唯一element或
elements列表
只有当标签有class 属性时才能使用
tag定位可能不唯一element或
elements列表
通常得到的都是一组列表
link_text精确定位可能不唯一element或
elements列表
一般情况定位是唯一的,
只有存在link_text相同时,才得到列表
link_text模糊定位可能不唯一element或
elements列表
一般用于定位<a></a>标签
xpath定位可能不唯一element或
elements列表
一般用来做精确定位,用/表示元素层级关系,xpath属性定位值必须加引号
css选择器定位可能不唯一element或
elements列表
一般用作精确定位,用>空格表示元素
层级关系,属性值可以不加引号

2.3、文本输入、清除与提交

  • send_keys('XXX')文本输入。
  • clear()文本清空。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 通过css选择器定位输入框
input_text = browser.find_element(By.CSS_SELECTOR,'#toolbar-search-input')
# 输入文本
input_text.send_keys("selenium")
# 停留2秒
time.sleep(2)
# 清空文本
input_text.clear()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
  • submit()提交
  • 注意:submit()只能用于包含属性type='submit'的标签,并且嵌套在form表单中。
  • 也可以使用click()代替submit()使用。
  • 注意:submit()click()是有很大区别的,这里不再做具体说明。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.bing.com")
# 通过xpath选择器定位输入框,并输入CSDN
input_text = browser.find_element(By.XPATH,'//*[@id="sb_form_q"]').send_keys("CSDN")
time.sleep(2)
# 定位提交按钮后提交
browser.find_element(By.XPATH,'//*[@id="sb_form_go"]').submit()
# 停留3秒后关闭
time.sleep(3)
browser.quit()

2.4、获取页面内容

  • title页面标题
  • page_source 页面源码
  • current_url页面连接
  • text标签内文本
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 获取标题
title = browser.title
# 输出
print(title)
# 获取源代码
source_code = browser.page_source
#输出源代码
print(source_code)
# 获取页面链接
url = browser.current_url
#输出页面链接
print(url)
# 获取标签内文本
text = browser.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/div/button/span').text
print(text)
# 关闭页面
time.sleep(3)
browser.quit()

输出结果太多,这里不在展示,自行在PyCharm上演示。

2.5、隐式等待

  • implicitly_wait(N)通过一定时长等待页面元素加载,最大等待时长N秒,如果中间某个时刻元素加载好了,就会结束等待,执行下一步操作;如果超出设置时间元素没加载出来,抛出没有这样的元素异常。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 隐式等待
browser.implicitly_wait(5)
# 关闭页面
browser.quit()
time.sleep(3)

2.6、调整浏览器窗口尺寸

  • maximize_window()窗口最大化。
  • minimize_window()窗口最小化。
  • set_window_size(width,height)调整窗口到指定尺寸。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 窗口最大化
browser.maximize_window()
#停留2秒
time.sleep(2)
#窗口最小化
browser.minimize_window()
# 指定窗口尺寸
browser.set_window_size(300, 500)
# 关闭页面
time.sleep(3)
browser.quit()

2.7、前进一页后退一页

  • forward()前进一页。
  • back()后退一页。
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By

# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
browser.find_element(By.LINK_TEXT, 'Python').click()
#停留2秒
time.sleep(2)
# 页面后退一页
browser.back()
# 停留2秒
time.sleep(2)
# 前进一页
browser.forward()
# 关闭页面
time.sleep(3)
browser.quit()

2.8、页面刷新

  • refresh()页面刷新
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
browser.find_element(By.LINK_TEXT, 'Python').click()
#停留2秒
time.sleep(2)
# 页面刷新
browser.refresh()
# 关闭页面
time.sleep(3)
browser.quit()

2.9、窗口切换

  • current_window_handle获取当前窗口的句柄
  • window_handles获取所有打开页面的句柄,是一个列表
  • switch_to.window(“XX”)切换到指定页面,XX代表页面句柄
  • switch_to.frame(XX)切换到内敛框架页面,XX代表内联框架标签的定位对象,演示请看章节2.10源码。
  • swith_to.parent_frame()切回到内敛框架的上一级,即从内敛框架切出。演示请看章节2.10源码。
  • switch_to.alert切换到页面弹窗,演示请看章节2.13源码。
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
sleep(2)
# 获取当前窗口句柄
page_context = browser.current_window_handle
# 打开其它页面
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium')
browser.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/div/button/span').click()
sleep(2)
# 切换到刚开始打开页面
browser.switch_to.window(page_context)
# 获取当前打开所有页面的句柄
pages_context = browser.window_handles
# 输出当前打开页面个数
print(len(pages_context))  # 结果:2
# 关闭
sleep(3)
browser.quit()

2.10、frame/iframe内元素操作

选取框架内元素,首先我们要定位到框架元素,然后切换到框架页面,才能对框架页面内元素进行操作。

由于找不到内敛框架的页面,这里我自己简单写了个页面。下边是HTML源码,操作时注意路径get()url不要写错。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>frame内敛框架页面</title>
</head>
<body>
	这是框架frame外:<input type="text" >
	<iframe id='frame' src="http://www.csdn.net" width=1000px height=500px></iframe>
</body>
</html>
  • switch_to.frame(tag_iframe)切换到frame/iframe框架页面。
  • switch_to.parent_frame()从内敛框架中切出。
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("file:///C:/Users/admin/Desktop/frame.html")
sleep(2)
# 定位到iframe标签
tag_iframe = browser.find_element(By.TAG_NAME, 'iframe')
# 切换到iframe框架页面内
browser.switch_to.frame(tag_iframe)
# 定位到框架内搜索框并输入内容
browser.find_element(By.LINK_TEXT, 'Python').click()
sleep(2)
# 从内敛框架页面切出
browser.switch_to.parent_frame()
browser.find_element(By.XPATH, "//input").send_keys("这是框架外面!")
# 关闭浏览器
sleep(3)
browser.quit()

2.11、获取标签元素的属性值(复选框)

  • get_attribute("XX")获取标签属性值,XX为标签属性名。
  • 这里我们通过获取标签元素的属性值,对标签进行操作。以下示例为通过获取复选框标签的属性值对复选框进行选取。
  • 页面HTML源码:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
	用户名:<input type="text" name="user_name">
	密码:<input type="password" name="pwd">
	<input type="checkbox" name="Java">Java
	<input type="checkbox" name="Python">Python
	<input type="checkbox" name="C++">C++
	<input type="checkbox" name="JavaScript">JavaScript
	<input type="checkbox" name="HTML">HTML
</body>
</html>
  • Python源码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("file:///C:/Users/admin/Desktop/checkbox.html")
# 定位input标签
tag_input = browser.find_elements(By.TAG_NAME, 'input')
# 通过type属性的值来定位元素,并进行选取
for type_value in tag_input:
    # 输出input标签的name属性的值:
    print(type_value.get_attribute("name"))
    # 对复选框进行选取操作
    if type_value.get_attribute("type") == "checkbox":
        type_value.click()
        time.sleep(2)
# 关闭浏览器
time.sleep(3)
browser.quit()
  • 控制台输出结果:
user_name
pwd
Java
Python
C++
JavaScript
HTML

2.12、下拉列表操作

  • Select("XX)判断标签元素XX是否为下拉列表元素,返回Select对象,不是报错
  • select_by_value("XX")通过下拉列表value属性的值XX选择选项
  • select_by_visible_text("XX")通过下拉列表文本内容XX选择选项
  • select_by_index(N)options[N].click()通过下拉列表索引号N选则选项,从0 开始
  • options下拉列表内options标签
  • 页面HTML源码:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
	编程语言:<select>
		<option>Java</option>
		<option>C++</option>
		<option value="Python">Python</option>
		<option>HTML</option>
		<option>JavaScript</option>
	</select>
</body>
</html>
  • Python 源码
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入Select类
from selenium.webdriver.support.select import Select

# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("file:///C:/Users/admin/Desktop/select.html")
# 定位下拉列表标签,并创建下拉列表对象
select = Select(browser.find_element(By.TAG_NAME, "select"))
# 通过value属性选择选项
select.select_by_value("Python")
sleep(2)
# 通过文本内容选择选项
select.select_by_visible_text("C++")
sleep(2)
# 通过选项索引号选择选项
select.select_by_index(0)  # 等同于 select.options[0].click()
sleep(2)
# 通过options属性循环选取
for i in select.options:
    i.click()
    sleep(2)
# 关闭浏览器
sleep(3)
browser.quit()

2.13、弹窗操作

  • switch_to.alert获取弹窗对象。
  • text弹窗内容
  • accept()接受弹窗
  • dismiss()取消弹窗

页面HTML源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
	<input type="button" id="alert" value="alert弹窗" onclick="alert('这是alert()弹窗!')">
	<input type="button" id="confirm"value="confirm弹窗" onclick="confirm('这是confirm()弹窗!')" >
	<input type="button" id="prompt" value="prompt弹窗" onclick="prompt('这是prompt()弹窗!','这是prompt()弹窗的默认值!')">
</body>
</html>

Python源码

from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("file:///C:/Users/admin/Desktop/alert.html")
# alert()弹窗处理
browser.find_element(By.ID, "alert").click()
sleep(2)
# 获取弹窗对象
alert = browser.switch_to.alert
# 输出弹窗内容
print(alert.text)  # 结果:这是alert()弹窗!
# 确认弹窗
alert.accept()
sleep(2)
# confirm()弹窗
browser.find_element(By.ID, "confirm").click()
sleep(2)
# 获取弹窗对象
confirm = browser.switch_to.alert
# 输出弹窗内容
print(confirm.text)  # 这是confirm()弹窗!
# 执行性弹窗的取消按钮
confirm.dismiss()  # confirm.accept() # 执行弹窗确认按钮
sleep(2)
# prompt()弹窗
browser.find_element(By.ID, "prompt").click()
sleep(2)
# 获取弹窗对象
prompt = browser.switch_to.alert
# 输出弹窗内容
print(prompt.text)  # 这是prompt()弹窗!
# 向弹窗的输入框内输入内容
prompt.send_keys("这是弹窗prompt()")
sleep(2)
# 执行性弹窗的确认按钮
prompt.accept()
# 关闭浏览器
sleep(3)
browser.quit()

2.14、鼠标操作

  • 鼠标操作涉及到的类:ActionChains

  • move_to_element(X)鼠标悬停,X代表定位到的标签

  • double_click(X)双击

  • context_click(X)右击

  • perform() 执行所有存储在ActionChains()类中的行为,做最终的提交

不管执行哪个方法,最后都要调用perform()方法,将操作呈现出来。

from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("https://www.csdn.net")
sleep(2)
# 创建ActionChains对象
action = ActionChains(browser)
# 定位标签并将鼠标移入,并呈现移入结果
tag = browser.find_element(By.XPATH, '//div/a[@class="btn-write-new"]')
action.move_to_element(tag).perform()
sleep(3)
tag = browser.find_element(By.CSS_SELECTOR, '.blog-nav-box')
action.move_to_element(tag).perform()
sleep(2)
browser.find_element(By.LINK_TEXT, "数学").click()
# 关闭浏览器
sleep(2)
browser.quit()

2.15、键盘操作

  • send_keys(Keys.BACK_SPACE)执行回退键Backspace
  • send_keys(Keys.CONTROL,'a')全选
  • send_keys(Keys.CONTROL,'x')剪切
  • send_keys(Keys.CONTROL,'c')复制
  • send_keys(Keys.CONTROL,'v')粘贴
from time import sleep
# 导入selenium包
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("https://www.csdn.net")
sleep(2)
input_text = browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]')
input_text.send_keys("selenium")
sleep(2)
input_text.send_keys(Keys.CONTROL, "a")  # 全选
sleep(2)
input_text.send_keys(Keys.CONTROL, 'x')  # 剪切
sleep(2)
input_text.send_keys(Keys.CONTROL, 'v')  # 粘贴
sleep(2)
input_text.send_keys(Keys.BACK_SPACE)  # 回退一格
# 关闭浏览器
sleep(2)
browser.quit()

2.16、JS代码执行

  • execute_script(X)执行JS代码,X代表要执行的JS代码
from time import sleep
# 导入selenium包
from selenium import webdriver
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("https://www.csdn.net")
sleep(2)
# 执行js弹窗代码
browser.execute_script("alert('这是js弹窗代码')")
sleep(2)
browser.switch_to.alert.accept()
sleep(2)
# 执行js窗口滚动条代码
browser.execute_script("window.scrollTo(20,1000)")
sleep(2)
# 打开多个窗口
browser.execute_script("window.open('https://www.baidu.com')")
browser.execute_script("window.open('https://www.bing.com')")
sleep(2)
browser.quit()

2.17、窗口截图

  • get_screenshot_as_file(XX)浏览器窗口截屏,XX代表文件保存地址及文件名、格式。只写文件名保存至当前路径,若写路径,则路径必须存在。
from time import sleep
# 导入selenium包
from selenium import webdriver
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("https://www.csdn.net")
sleep(2)
# 浏览器窗口截屏
browser.get_screenshot_as_file("csdn.png")
sleep(2)
browser.quit()

2.18、三种等待方法

  • sleep(n)强制等待,需要导入time包,n表示等待秒数;用于避免因元素未加载出来而定位失败的情况。
  • implicitly_wait(n)隐式等待,如果超过n秒,抛出找不到元素的异常;隐式等待只需要声明一次,一般在打开浏览器后进行声明。隐式等待存在的问题是程序会一直等待整个页面加载完成才会执行下一步,有时候想要定位的元素早就加载好了,但是由于别的页面元素没加载好,仍会等到整个页面加载完成才能执行下一步。
  • WebDriverWait(browser,n,h):显式等待,browser代表浏览器对象,n等待时长,h频率。相比于隐式等待,显式等待只针对指定的元素生效,不再是针对所有的页面元素。可以根据需要定位的元素来设置显式等待,无需等待页面完全加载,节省了大量因加载无关紧要的页面元素而浪费的时间。使用方法:WebDriverWait(browser,5,0.5).until(expected_conditions.presence_of_element_located((By.ID,'kw')))
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox()
sleep(2)
# 打开csdn首页
browser.get("https://www.csdn.net")
tag = WebDriverWait(browser, 5, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="toolbar-search-input"]')))
tag.send_keys("selenium")
#关闭
sleep(2)
browser.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/688934.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬件产品经理

边端协调管理平台 主页一&#xff1a;模型管理1.1 边侧模型管理 二&#xff1a;配置管理2.1 终端软件配置管理 三&#xff1a;设备管理3.1 区域位置管理3.2 工控机管理&#xff08;其实就是围绕授权&#xff09;3.3 生产设备管理3.4 设备运行管理 四&#xff1a;数据服务4.1 实…

ISP:企业数字化发展的关键推动力

在当今信息化时代&#xff0c;互联网已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;对于很多人来说&#xff0c;ISP这一概念仍显得有些陌生。ISP&#xff0c;即互联网服务提供商&#xff08;Internet Service Provider&#xff09;&#xff0c;是为用户提供互联网接…

【课程总结】Day6(上):机器学习项目实战--外卖点评情感分析预测

机器学习项目实战&#xff1a;外卖点评情感分析预测 项目目的 基于中文外卖评论数据集&#xff0c;通过机器学习算法&#xff0c;对评论内容进行情感预测。 数据集 地址&#xff1a;http://idatascience.cn/dataset-detail?table_id429数据集字段 字段名称字段类型字段说…

package.json中resolutions的使用场景

文章目录 用途配置示例使用方法注意事项和peerDependencies有什么不同peerDependenciesresolutions 总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的…

谈AI 时代网站的未来趋势

以大语言模型为代表的AI 技术迅速发展&#xff0c;将会影响原有信息网络的方式。其中一个明显的趋势是通过chatGPT 对话代替搜索引擎和浏览器来获取信息。 互联网时代&#xff0c;主要是通过网站&#xff08;website&#xff09;提供信息。网站主要为人类阅读的方式构建的。主要…

阿里 Qwen2 模型开源,教你如何将 Qwen2 扩展到百万级上下文

本次开源的 Qwen2 模型包括 5 个尺寸&#xff0c;分别是 0.5B、1.5B、7B、72B、57B&#xff0c;其中 57B 的属于 MoE 模型&#xff08;激活参数 14B&#xff09;&#xff0c;其余为 Dense 模型&#xff0c;本篇文章会快速介绍下各个尺寸模型的情况&#xff0c;然后重点介绍下如…

西门子PLC学习之数据块的单个实例,多重实例与参数实例间的区别

首先介绍下函数&#xff0c;函数块与数据块这三个概念。 数据块 数据块里可以存储各种类型的参数。有人可能会问&#xff0c;m寄存器不是可以存储布尔值&#xff0c;8位&#xff0c;16位&#xff0c;32位变量吗&#xff0c;为什么要多此一举&#xff1f;因为虽然m寄存器能存储以…

LAMPSECURITY: CTF4 靶机实战

信息收集&#xff1a; 存活扫描&#xff1a; 端口扫描&#xff1a; 服务扫描&#xff1a; web页面&#xff1a; blog页面发现注入点&#xff1a; sql注入&#xff1a; sqlmap一把梭&#xff1a; 多个参数记得打&#xff1a; 哦 ssh登录&#xff1a; 老版本的ssh&#xff0c;…

重回1990短视频全集:成都鼎茂宏升文化传媒公司

重回1990短视频全集&#xff1a;时光之旅的温情回顾 在数字技术的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为我们记录生活、分享故事的新方式。而当我们回望过去&#xff0c;那些充满怀旧情怀的年份总是让人心生感慨。今天&#xff0c;就让我们一起踏上…

Oracle EBS AP发票创建会计科目提示:APP-SQLAP-10710:无法联机创建会计分录

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 提交“创建会计科目”请求提示错误信息如下: APP-SQLAP-10710:无法联机创建会计分录。 请提交应付款管理系统会计流程,而不要为此事务处理创建会计分录解决方法 数据修复SQL脚本: UPDATE ap_invoi…

Linux 36.3 + JetPack v6.0@jetson-inference之图像分类

Linux 36.3 JetPack v6.0jetson-inference之图像分类 1. 源由2. imagenet2.1 命令选项2.2 下载模型2.3 操作示例2.3.1 单张照片2.3.2 视频 3. 代码3.1 Python3.2 C 4. 参考资料5. 补充5.1 第一次运行模型本地适应初始化5.2 samba软连接 1. 源由 从应用角度来说&#xff0c;图…

使用 Apache Commons Exec 自动化脚本执行实现 MySQL 数据库备份

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

windows任意窗口置顶/前台显示/不被最小化或遮挡

问题&#xff1a;在办公时&#xff0c;当同时需要打开好几个重要的窗口&#xff0c;比如需要对若干个文件夹里的文件进行操作&#xff0c;几个窗口都需要一直在桌面前台显示&#xff0c;但这样的话容易在打开其他页面或是切其他窗口的时候被遮挡&#xff0c;因此考虑如何让几个…

Java学习笔记(六):Array List、学生管理系统、学生管理系统升级版

目录 一、ArrayList 1.1集合和数组的优势对比&#xff1a; 1.2 ArrayList类概述 1.3 ArrayList类常用方法 1.3.1 构造方法 1.3.2 成员方法 1.4 ArrayList存储字符串并遍历 1.5 ArrayList存储学生对象并遍历 1.6 查找用户的索引 1.7 添加手机对象并返回要求的数据 二…

想要提升地推效果吗?试试Xinstall数据查看功能,让您事半功倍!

在如今竞争激烈的移动互联网时代&#xff0c;地推作为一种直接有效的推广方式&#xff0c;受到了越来越多企业和品牌的青睐。然而&#xff0c;地推过程中产生的数据如何高效地收集、整理和分析&#xff0c;成为了摆在推广者面前的一大难题。Xinstall作为一款专业的App推广工具&…

开发人员必备的常用工具合集-lombok

Project Lombok 是一个 java 库&#xff0c;它会自动插入您的编辑器和构建工具&#xff0c;为您的 Java 增添趣味。 再也不用编写另一个 getter 或 equals 方法了&#xff0c;只需一个注释&#xff0c;您的类就拥有了一个功能齐全的构建器&#xff0c;自动化了您的日志记录变量…

CSS基础知识汇总

目录 CSS 基础知识1. CSS 的基本结构2. 选择器3. 常用 CSS 属性4. CSS 单位5. CSS 盒模型 总结 学习 CSS&#xff08;Cascading Style Sheets&#xff09;是前端开发的重要部分&#xff0c;它用于控制网页的样式和布局。以下是学习 CSS 过程中需要掌握的基本概念、符号和对应的…

Alsa UCM

Alsa Use Case Manager&#xff08;用例管理器&#xff09;描述如何为某些用例&#xff08;如 “播放音频”、“通话”&#xff09;设置 mixer 混频器。它还描述如何修改 mixer 混频器状态以将音频路由到某些输出和输入&#xff0c;以及如何控制这些设备。 这基本上涵盖了 Pul…

【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b

chatglm2构建时使用了RUST&#xff0c;所以在安装chatglm2之前&#xff0c;先安装RUST。 此系列文章列表&#xff1a; 【AI基础】第一步&#xff1a;安装python开发环境-windows篇_下载安装ai环境python-CSDN博客 【AI基础】第一步&#xff1a;安装python开发环境-conda篇_mini…

uniapp余额银行卡支付密码界面实现(直接复制)

示例&#xff1a; 插件地址&#xff1a;自定义数字/身份证/密码输入框&#xff0c;键盘密码框可分离使 - DCloud 插件市场 1.下载插件并导入HBuilderX&#xff0c;找到文件夹&#xff0c;copy number-keyboard.vue一份为number-keyboard2.vue&#xff08;number-keyboard.vue是…