目录
一、环境准备
1、Selenium安装教程
2、下载浏览器驱动
3、验证环境
二、元素定位
三、浏览器常见操作
1、打开页面
2、修改浏览器窗口大小
3、浏览器前进&后退
4、浏览器切换
5、浏览器刷新
6、浏览器元素操作
7、浏览器关闭
四、元素常见操作
1、鼠标常见操作
2、键盘常见操作
3、弹窗常见操作
4、滚动条
5、等待时间
一、环境准备
1、Selenium安装教程
1.1 打开cmd,输入如下命令:pip/pip3 install selenium
1.2 安装完成后查看Python路径包管理(Lib\site-packages)文件夹下存在selenium文件夹
?
1.3 查看版本(也可以用来查看是否安装成功):pip show selenium
2、下载浏览器驱动
2.1 查看浏览器版本:chrome://settings/help
2.2 下载对应驱动:https://chromedriver.storage.googleapis.com/index.html
2.3 直接放在Python的安装路径下即可
3、验证环境
from selenium import webdriver
# Chrome浏览器
driver = webdriver.Chrome()
if __name__ == '__main__':
# 打开百度浏览器
driver.get('https://www.baidu.com/')
二、元素定位
1、id 定位
标签的 id 具有唯一性,就像人的身份证
driver.find_element_by_id("id")
2、name 定位
name 指定标签的名称,在页面中可以不唯一。
driver.find_element_by_name("name")
3、class 定位
class 指定标签的类名,在页面中可以不唯一
driver.find_element_by_class_name("s_form_wrapper")
4、tag 定位
每个 tag 往往用来定义一类功能,所以通过 tag 来识别某个元素的成功率很低,每个页面一般都用很多相同的 tag ,比如:\<div\>、\<input\> 等。
driver.find_element_by_tag_name("div")
5、xpath 定位
xpath 是一种在 XML 文档中定位元素的语言,它拥有多种定位方式
# 1>利用元素属性定位
driver.find_element_by_xpath("//*[@id='kw']")
# 2>绝对路径(层级关系)定位
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")
# 3>层级+元素属性定位
driver.find_element_by_xpath("//div[@id='wrapper']/div[1]/div[5]/div/div/form/span[1]/input")
# 4>逻辑运算符定位
driver.find_element_by_xpath("//*[@id='kw' and @name='wd']")
6、css 定位
CSS 使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的任意属性,一般定位速度比 xpath 要快,但使用起来略有难度。
?
# 1>#id:选择对应id的元素
driver.find_element_by_css_selector("#kw")
# 2>.class:选择所有使用该class的元素
driver.find_element_by_css_selector(".s_form_wrapper")
# 3>element:选择所有 <element\> 元素
driver.find_element_by_css_selector("input")
# 4>element>element:比如div>input,选择父元素为 <div\> 的所有 <input\> 元素
driver.find_element_by_css_selector("span>input")
# 5>element+element:比如div+input,选择同一级中在 <div\> 之后的所有 <input\> 元素
driver.find_element_by_css_selector("span+input")
# 6>[attribute=value]:比如type='text',选择 type = 'text' 的所有元素
driver.find_element_by_css_selector("[type='submit']")
7、link 定位
link 专门用来定位文本链接
driver.find_element_by_link_text("新闻")
8、partial_link 定位
partial_link 翻译过来就是“部分链接”,对于有些文本很长,这时候就可以只指定部分文本即可定位
driver.find_element_by_partial_link_text("新")
三、浏览器常见操作
1、打开页面
1.1 在原标签页打开
driver.get('https://www.csdn.net/') # 会在原来窗口打开该页面
1.2 在新标签页打开
# 在新标签页中打开页面利用js
blogs = "window.open('https://www.cnblogs.com/')"
driver.execute_script(blogs)
sleep(2)
2、修改浏览器窗口大小
2.1 修改为固定大小
driver.set_window_rect(width=800, height=700)
2.2 最大化
2.3 最小化
2.4 指定浏览器窗口的起始坐标
driver.set_window_rect(x=50, y=50)
3、浏览器前进&后退
3.1 后退
3.2 前进
4、浏览器切换
4.1 标签页的切换
# 1>获取打开的多个窗口句柄
windows = driver.window_handles # <class 'list'>
# 2>切换到打开的第一个窗口
driver.switch_to.window(windows[0])
4.2 窗口切换
① 若打开新的标签页,则selenium实际操作的还是之前的页面
from selenium import webdriver
handles = []
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
# 获取当前窗口的句柄
handles.append(driver.current_window_handle)
# 点击页面进入一个新的标签页
driver.find_element_by_link_text("地图").click()
# 获取句柄
handles.append(driver.current_window_handle)
print(handles)
print(driver.current_window_handle)
>>>>
['CDwindow-29A55CC9880075BD2CEFADB5C2360219', 'CDwindow-29A55CC9880075BD2CEFADB5C2360219']
CDwindow-29A55CC9880075BD2CEFADB5C2360219
# 根据结果可以看出,虽然打开新的窗口,但是实际操作的窗口句柄一直是最先打开的窗口,未发生变化
② 若想操作新打开的窗口,必须进行窗口切换
# 在①的代码,进入新标签页后添加切换窗口代码
# 切换窗口到最新窗口
driver.switch_to.window(driver.window_handles[-1])
>>>>
['CDwindow-6A70B3BF5D94A1A1ABF92B6E16885182', 'CDwindow-E56FC7EEE8138457D353197961F8E2AD']
CDwindow-E56FC7EEE8138457D353197961F8E2AD
# 结果可以看到此时会产生两个窗口的句柄,而当前操作的窗口为新打开的窗口
5、浏览器刷新
6、浏览器元素操作
6.1 输入文本
input_text = driver.find_element_by_id("kw")
input_text.send_keys("输入的文本内容")
sleep(1)
6.2 清空文本
6.3 返回元素的文本内容
buttonText = driver.find_element_by_id("s-top-loginbtn")
print(buttonText.text)
6.4 获取标签属性值
print(buttonText.get_attribute("name"))
6.5 返回元素的尺寸
6.6 判断该元素是否可见
print(buttonText.is_displayed())
7、浏览器关闭
7.1 关闭当前
7.2 关闭全部
四、元素常见操作
1、鼠标常见操作
1.1 单击左键
# 打开浏览器
driver = webdriver.Chrome()
driver.get('https://www.cnblogs.com/')
driver.maximize_window()
sleep(2)
# 单击左键:不需要用到 ActionChains
input = driver.find_element_by_id("zzk_search_input")
input.click()
1.2 单击右键
# 单击右键:需要使用 ActionChains
input_news = driver.find_element_by_link_text("新闻")
ActionChains(driver).context_click(input_news).perform()
1.3 双击
# 双击
button = driver.find_element_by_id("zzk_search_input")
ActionChains(driver).double_click(button).perform()
1.4 拖动
# 1>定位要拖动的元素
source = driver.find_element_by_xpath("//*[@id='nav_left']/li[1]/a/img")
# 2>定位目标元素
target = driver.find_element_by_xpath("//*[@id='zzk_search_input']")
# 3>执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()
1.5 悬停
find_button = driver.find_element_by_xpath('//*[@id="nav_left"]/li[9]/div[1]/a')
ActionChains(driver).move_to_element(find_button).perform()
2、键盘常见操作
2.1 单个字母&数字按键
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
# 打开浏览器
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.maximize_window()
sleep(2)
# 定位输入框
input_button = driver.find_element_by_id("kw")
# 单个字母&数字按键
input_button.send_keys("abcd1234")
2.2 组合键
# 组合键
input_button.send_keys(Keys.CONTROL, 'a')
input_button.send_keys(Keys.CONTROL, 'c')
input_button.send_keys(Keys.CONTROL, 'v')
2.3 其他按键
input_button.send_keys(Keys.F5) # F*按键
input_button.send_keys(Keys.BACK_SPACE) # 删除
input_button.send_keys(Keys.SPACE) # 空格
input_button.send_keys(Keys.TAB) # tab键
input_button.send_keys(Keys.ESCAPE) # ESC键
input_button.send_keys(Keys.ALT) # Alt键
input_button.send_keys(Keys.SHIFT) # Shift键
input_button.send_keys(Keys.ARROW_DOWN) # 向下箭头
input_button.send_keys(Keys.ARROW_LEFT) # 向左箭头
input_button.send_keys(Keys.ARROW_RIGHT) # 向右箭头
input_button.send_keys(Keys.ARROW_UP) # 向上箭头
input_button.send_keys(Keys.ENTER) # 回车
3、弹窗常见操作
3.1 弹窗类型:共计alert、confirm、prompt三种类型弹窗
3.2 弹窗操作顺序:先定位,在切换到弹窗中,再进行其操作
3.3 新建一个tabl.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function alertFunction(){
alert("你好,我是一个alert框!");
}
function confirmFunction(){
confirm("你好,我是一个confirm框!");
}
function promptFunction(){
prompt("你好,我是一个prompt框!");
}
</script>
</head>
<body>
<input id="alert" type="button" onclick="alertFunction()" value="显示警告框">
<input id="confirm" type="button" onclick="confirmFunction()" value="显示confirm框">
<input id="prompt" type="button" onclick="promptFunction()" value="显示prompt框">
</body>
</html>
3.4 弹窗操作练习
# 关于弹窗相关处理:先定位,在切换到弹窗中,再进行其操作
driver = webdriver.Chrome()
driver.get('file:///' + str(Path(Path.cwd(), 'table.html')))
# 点击alert按钮
driver.find_element_by_id("alert").click()
sleep(1)
# 切换到弹窗
alert = driver.switch_to.alert
# 打印弹窗中内容
print(alert.text)
# 确认
alert.accept()
sleep(1)
# 点击confirm按钮
driver.find_element_by_id("confirm").click()
confirm = driver.switch_to.alert
sleep(1)
# 取消弹窗内容
confirm.dismiss()
sleep(1)
4、滚动条
4.1 通过x,y来进行滑动
4.2 通过参照物来进行滑动
# 滚动条
# 1>通过坐标定位滚动
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.cnblogs.com/xuanling/")
sleep(1)
js = "window.scrollTo(0,500);"
driver.execute_script(js)
# 2>通过参照物进行滚动
driver.implicitly_wait(3)
for i in range(1, 20, 1):
sleep(1)
target = driver.find_element_by_xpath(f'//*[@id="main"]/div[{i}]/div[1]/a/span')
driver.execute_script("arguments[0].scrollIntoView();", target)
5、等待时间
5.1 强制等待
from time import sleep
sleep(1)
5.2 显示等待
① WebDriverWait()
② 最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在,若存在则提前结束等待。若超时未找到则报错。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
③ from selenium.webdriver.support.ui import WebDriverWait
④ 显示等待作用于你当前使用函数查找的这个元素,确保它快速高效的找到,显示等待不会管其他你要查找的元素的。
⑤ 使用webdriverwait只能够与until和not until两个方法进行使用;until和not until中传入的参数可以是lambda匿名函数或者预置条件expected_conditions
from selenium import webdriver
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.get("http://www.baidu.com")
try:
# WebDriverWait(driver, 5, poll_frequency = 1):等待5s,间隔时间为1s(默认为0.5)
# until(method,message='') 方法是当某条件成立则继续执行。until_not 方法与之相反,它是当某条件不成立则继续执行,参数与 until 方法相同
# method: 在等待期间,每隔poll_frequency调用这个方法,直到返回值不是 False
# message:如果超时,抛出 TimeoutException,将 message 传入异常
# id判断kw元素是否存在,若存在则print,不存在则打印message
element = WebDriverWait(driver, 5, 1).until(EC.presence_of_element_located((By.ID, "kw")), message='若超时,抛出异常时显示的内容')
print("element by.ID_kw is:", element)
# id判断11元素是否存在,若存在则print,不存在则打印message
element_11 = WebDriverWait(driver, 5, 1).until(EC.presence_of_element_located((By.ID, "11")),
message='判断element by.ID_11 是否存在,不存在时判断超时抛出异常,显示该内容')
print(element_11)
# id判断kw元素是否不存在,若存在则会判断超时打印message,不存在则继续执行
element_kw = WebDriverWait(driver, 5, 1).until_not(EC.presence_of_element_located((By.ID, "kw")),
message='判断element by.ID_kw 不存在,存在导致判断超时,抛出异常显示该内容')
print(element_kw)
# id判断22元素是否不存在,若不存在则判断成功输出true,存在则打印message
element_22 = WebDriverWait(driver, 5, 1).until_not(EC.presence_of_element_located((By.ID, "22")),
message='判断element by.ID_22 是否不存在,若22元素存在,判断失败(超时)打印该信息')
except Exception as e:
print(e)
finally:
driver.quit()
5.3 隐示等待
① implicitly_wait()
② 隐式等待作用于全局,确保每一个你查找的元素都能够有足够的load时长,以便找到它使脚本正常运行。
from selenium import webdriver
from time import time
driver = webdriver.Chrome()
driver.get('https://www.cnblogs.com/xuanling/')
# 隐示等待
start = time()
driver.implicitly_wait(5)
try:
driver.find_element_by_id('kw')
except Exception as e:
print(e)
print(f'耗时:{time()-start}')
finally:
driver.quit()
|