一、鼠标事件
1.导包: from selenium.webdriver import ActionChains
2.整体语法: ActionChains(driver).方法名(元素).preform(),语法及实现代码如下:
双击: ActionChains(driver).double_click(ele).perform()
右击(重要): ActionChains(driver).context_click(ele).perform()
鼠标悬停(重要): ActionChains(driver).move_to_element(ele).perform()
鼠标拖动:ActionChains(driver).drag_and_drop(原始元素,目标元素).perform()
指定坐标点的位置进行拖动(重要): x轴和y轴以左上角的原点位置为(0,0)
语法:ActionChains(driver).drag_and_drop_by_offset(目标元素, x轴坐标, y轴坐标).perform()
#鼠标双击及右击--实现代码
from selenium import webdriver
import time
# 导包
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 定位百度的新闻元素
ele = driver.find_element_by_link_text('新闻')
# 实例化鼠标的对象,也可以直接ActionChains(driver)实例化鼠标对象,本行代码可省略
action_chains = ActionChains(driver)
# 调用鼠标的双击的方法
ActionChains(driver).double_click(ele).perform()
# 调用鼠标右击的方法
ActionChains(driver).context_click(ele).perform()
#鼠标悬停--实现代码
from selenium import webdriver
import time
# 导包
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 窗口最大化
driver.maximize_window()
# 定位百度的设置元素
ele = driver.find_element_by_css_selector('span[id="s-usersetting-top"]')
# 调用鼠标悬停的方法
ActionChains(driver).move_to_element(ele).perform()
time.sleep(2)
driver.quit()
#按下鼠标左键--实现代码
from selenium import webdriver
import time
# 导包
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 窗口最大化
driver.maximize_window()
# 定位百度输入框
ele = driver.find_element_by_id('su')
time.sleep(5)
# 按下鼠标的左键
ActionChains(driver).click_and_hold(ele).perform()
time.sleep(2)
driver.quit()
#鼠标拖动---实现代码
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
# 打开鼠标拖动练习的网页,见下方练习代码
driver.get('file:///D:/BaiduNetdiskDownload/%E6%B5%8B%E8%AF%95%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3/%E5%AD%A6%E4%B9%A0/20230521python%E5%AD%A6%E4%B9%A0/%E7%BB%83%E4%B9%A0%E9%A1%B5%E9%9D%A2/drop.html')
#获取第一个元素
div1 = driver.find_element_by_id('div1')
#获取第二个元素
div2 = driver.find_element_by_id('div2')
time.sleep(5)
# 把元素从一个位置,拖动到另外一个元素的位置
ActionChains(driver).drag_and_drop(div1,div2).perform()
# 把元素拖动到指定的像素位置
ActionChains(driver).drag_and_drop_by_offset(div1, 800, 200).perform()
-----------------------------------------------------------------------------------------
-------------------------这里是鼠标拖动练习的代码-------------------------------------
--<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>拖拽div</title>
<style type="text/css">
div{
position:absolute;
width:150px;
height:150px;
background-color:red;
}
</style>
<script type="text/javascript">
<!--
function drag(obj)
{
if (typeof obj == "string") {
var obj = document.getElementById(obj);
obj.orig_index=obj.style.zIndex;
//设置当前对象永远显示在最上层
}
obj.onmousedown=function (a){
//鼠标按下
this.style.cursor="move";
//设置鼠标样式
this.style.zIndex=1000;
var d=document;
if(!a) a=window.event;
//按下时创建一个事件
var x=a.clientX-document.body.scrollLeft-obj.offsetLeft;
//x=鼠标相对于网页的x坐标-网页被卷去的宽-待移动对象的左外边距
var y=a.clientY-document.body.scrollTop-obj.offsetTop;
//y=鼠标相对于网页的y左边-网页被卷去的高-待移动对象的左上边距
d.onmousemove=function(a){//鼠标移动
if(!a) a=window.event;//移动时创建一个事件
obj.style.left=a.clientX+document.body.scrollLeft-x;
obj.style.top=a.clientY+document.body.scrollTop-y;
}
d.onmouseup=function (){//鼠标放开
document.onmousemove=null;
document.onmouseup = null;
obj.style.cursor="normal";//设置放开的样式
obj.style.zIndex=obj.orig_index;
}
}
}
-->
</script>
</head>
<body>
<div id="div1"> </div>
<div id="div2" style="left:170px; background-color:#408080"></div>
<script type="text/javascript">
<!--
drag("div1");
drag("div2");
-->
</script>
</body>
</html>
二、键盘事件
#键盘事件--实现代码
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('源码时代')
time.sleep(3)
# 键盘的使用必须和 send_keys 结合起来
driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)
time.sleep(2)
# 键盘写入tab键
driver.find_element_by_id('kw').send_keys(Keys.TAB)
time.sleep(3)
# 键盘写入回车键
driver.find_element_by_id('kw').send_keys(Keys.ENTER)
三、下拉菜单选择
#下拉菜单--实现代码
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Chrome()
driver.get('file:///D:/pythonstudy/5.21/%E6%B3%A8%E5%86%8CA.html')
# 定位点击下拉框
driver.find_element_by_id('select').click()
time.sleep(2)
# 点击选中对应的选项
driver.find_element_by_css_selector('option[value="sh"]').click()
ele = driver.find_element_by_id('select')
select = Select(ele)
time.sleep(2)
# 通过value值来选择下拉选项
select.select_by_value("gz")
time.sleep(2)
# 通过索引值进行定位
select.select_by_index(3)
time.sleep(2)
select.select_by_value('bj')
time.sleep(2)
# 通过文本值进行定位
select.select_by_visible_text('重庆')
四、滚动条操作
#滚动条及聚焦元素--实现代码
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('file:///D:/pythonstudy/5.21/%E6%B3%A8%E5%86%8CA.html')
# 滚动条操作
# js = 'window.scrollTo(0,800)'
# time.sleep(2)
# driver.execute_script(js)
# 聚焦元素
ele = driver.find_element_by_id('alerta')
js = 'arguments[0].scrollIntoView();'
time.sleep(2)
driver.execute_script(js,ele)
time.sleep(2)
driver.quit()
五、iframe操作
-------------------------------------------iframe是什么?-------------------------------------------------
答:iframe是前端常用的一个标签,用于HTML页面的嵌套 会导致嵌套的页面元素能定位,但是实际上元素不在本页面 想要定位到iframe里面的元素,需要进行页面的切换
------------------------------------------怎么进行页面的切换?----------------------------------------
1.driver.switch_to.frame(name值或者id值)
2.driver.switch_to.frame(索引值) 索引从0开始
3.driver.switch_to.frame(定位的元素)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('file:///D:/BaiduNetdiskDownload/%E6%B5%8B%E8%AF%95%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3/%E5%AD%A6%E4%B9%A0/20230521python%E5%AD%A6%E4%B9%A0/%E7%BB%83%E4%B9%A0%E9%A1%B5%E9%9D%A2/%E6%B3%A8%E5%86%8C%E5%AE%9E%E4%BE%8B.html')
driver.switch_to.frame('myframe1')
# 定位账号然后输入内容
driver.find_element_by_css_selector('input[id="user"]').send_keys('admin')
# 执行滚动到底部
js = 'window.scrollTo(0,1000)'
driver.execute_script(js)
time.sleep(2)
# 页面切换
# 通过frame的name切换页面
# driver.switch_to.frame('myframe1')
# 通过frame的id进行页面切换
# driver.switch_to.frame('idframe1')
# 通过frame的索引值切换 从0开始
# driver.switch_to.frame(0)
# 通过元素定位来切换
ele = driver.find_element_by_css_selector('iframe[id="idframe1"]')
driver.switch_to.frame(ele)
# 定位账号A输入内容
driver.find_element_by_css_selector('input[id="userA"]').send_keys('adminA')
# 切换回默认页面,退出所有的嵌套
# driver.switch_to.default_content()
# 只退出一层嵌套
driver.switch_to.parent_frame()
driver.find_element_by_id('password').send_keys('123456')
driver.quit()
六、多窗口切换--两种方法
#多窗口切换第一种---实现代码
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('file:///D:/BaiduNetdiskDownload/%E6%B5%8B%E8%AF%95%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3/%E5%AD%A6%E4%B9%A0/20230521python%E5%AD%A6%E4%B9%A0/%E7%BB%83%E4%B9%A0%E9%A1%B5%E9%9D%A2/%E6%B3%A8%E5%86%8C%E5%AE%9E%E4%BE%8B.html')
time.sleep(2)
# 获取句柄
current_handle = driver.current_window_handle
print(current_handle)
time.sleep(2)
# 打开新浪
driver.find_element_by_id("fw").click()
time.sleep(2)
# 获取当前句柄
print(driver.current_window_handle)
# 获取所有的句柄,返回的是一个列表
print(driver.window_handles)
time.sleep(2)
# 切换到原来的界面
driver.switch_to.window(current_handle)
time.sleep(2)
# 通过索引获取句柄切换到新页面,索引从0开始
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
driver.quit()
#多窗口切换--第二种(js脚本去除)
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('file:///D:/BaiduNetdiskDownload/%E6%B5%8B%E8%AF%95%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3/%E5%AD%A6%E4%B9%A0/20230521python%E5%AD%A6%E4%B9%A0/%E7%BB%83%E4%B9%A0%E9%A1%B5%E9%9D%A2/%E6%B3%A8%E5%86%8C%E5%AE%9E%E4%BE%8B.html')
time.sleep(2)
# 准备js脚本
js = 'document.getElementById("fw").removeAttribute("target")'
# 执行js脚本去掉target属性
driver.execute_script(js)
driver.find_element_by_id('fw').click()
time.sleep(3)
# 回到原页面
driver.back()
driver.quit()
七、弹窗处理(原生弹窗、自定义弹窗)
# 1、为什么要取消弹窗?
因为存在弹窗之后页面的元素无法操作
原生弹窗:
alert:只有一个确定按钮
confirm:有一个确定按钮,一个取消按钮
prompt:有一个输入框,一个确定按钮,一个取消按钮
------------------------------------------------------------------------------------------
#2、弹窗处理语法--原生弹窗
alert:
变量 = driver.switch_to.alert
变量.accept()
confirm:
变量 = driver.switch_to.alert
变量.accept() 点击确定
变量.dismiss() 点击取消
prompt:
变量 = driver.switch_to.alert
变量.accept() 点击确定
变量.dismiss() 点击取消
变量.send_keys(内容) 输入内容
都可以使用:变量.text 获取弹窗的文字信息
#3、自定义弹窗处理--实现代码(通过js脚本实现)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://cd.itsource.cn/')
# 去除弹窗的js脚本,把显示属性设置为空
js = 'document.getElementById("div_company_mini").style.display="none"'
# 执行js脚本
driver.execute_script(js)
time.sleep(5)
driver.quit()
八、单选框,多选框
----------------------------------------------概念及语法--------------------------------------------------
单选框是在html代码里面 type是 radio 并且一组的单元 name属性值全部一样。多选框是html代码里面 type属性是 checkbox,name属性相同。
语法:元素.is_selected() 判断元素是否选中
#单选框、多选框---实现代码
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('file:///D:/pythonstudy/5.21/%E6%B3%A8%E5%86%8CA.html')
# 全选,获取所有的元素
eles = driver.find_elements_by_name('checkbox')
# # 打印获取的元素
# print(eles)
# time.sleep(3)
# # 遍历元素
# for ele in eles:
# # 判断为假
# if not ele.is_selected():
# # 就点击选中
# ele.click()
# time.sleep(3)
option = ("购物","旅游")
for ele in eles:
time.sleep(2)
# 判断获取的属性是否存在在选项中
if ele.get_attribute('value') in option:
time.sleep(2)
# 判断是否已经被选中
if not ele.is_selected():
# 没有选中才点击
ele.click()
time.sleep(2)
driver.quit()