一、浏览器操作
1.设置浏览器缩放大小
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# 设置宽和高
driver.set_window_size(480, 800)
2.浏览器的前进和后退
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(3)
# 后退
driver.back()
time.sleep(3)
# 前进
driver.forward()
3.浏览器的刷新
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(3)
# 后退
driver.back()
time.sleep(3)
# 前进
driver.forward()
time.sleep(3)
# 刷新当前页面
driver.refresh()
二、webdriver常见方法
1.元素的点击、文本内容的清除、输入
元素点击:.click()
内容的清除:clear()
内容的输入:send_keys(“九阳真经”)
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜素框
sercah_element = driver.find_element_by_id('kw')
# 输入内容
sercah_element.send_keys("九阳真经")
time.sleep(3)
# 先将之前输入的内容,清除掉
sercah_element.clear()
time.sleep(3)
# 再次给搜索框输入
sercah_element.send_keys('乾坤大挪移')
time.sleep(3)
# 点击 百度一下
driver.find_element_by_id('su').click()
2.submit提交表单
submit:可以用于表单的提交,可以在某些时候达到和click互换的效果
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜素框
sercah_element = driver.find_element_by_id('kw')
# 输入内容
sercah_element.send_keys("九阳真经")
# 直接使用submit进行提交
sercah_element.submit()
3.其他的方法
- size: 返回元素的尺寸。
打开浏览器
driver = webdriver.Edge()
设置浏览器最大化
driver.maximize_window()
设置隐式等待
driver.implicitly_wait(10)
打开网页
driver.get(“http://www.baidu.com“)
定位搜素框
sercah_element = driver.find_element_by_id(‘kw’)
输入内容
sercah_element.send_keys(“九阳真经”)
返回搜素框元素的大小 返回 {‘height’: 38, ‘width’: 503}
print(sercah_element.size)
- text: 获取元素的文本。
```python
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# 获取 hao123 按钮的文本信息
button_element = driver.find_element_by_css_selector('a[href="https://www.hao123.com?src=from_pc"]').text
print(button_element)
-
get_attribute(name): 获得属性值。
```python
from selenium import webdriver
import time
打开浏览器
driver = webdriver.Edge()
设置浏览器最大化
driver.maximize_window()
设置隐式等待
driver.implicitly_wait(10)
打开网页
driver.get(“http://www.baidu.com“)
time.sleep(2)
获取 百度一下 这个按钮元素的 value属性的值
button_value = driver.find_element_by_id(‘su’).get_attribute(“value”)
print(button_value)
is_displayed(): 设置该元素是否用户可见。
在页面上是否可以见到该元素,如果能看到,则返回true 否则返回false
```python
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# 获取 百度一下 这个按钮元素是否可见
button_element = driver.find_element_by_id('su')
# 一般使用场景,有时候页面会有弹窗,我们可以判断,如果弹窗可见(弹窗显示出来了),则就需要处理弹窗
print(button_element.is_displayed())
三、鼠标事件
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。ActionChains 类提供了鼠标操作的常用方法:
- perform(): 执行所有 ActionChains 中存储的行为;
- context_click(): 右击;
- double_click(): 双击;
- drag_and_drop(): 拖动;
- move_to_element(): 鼠标悬停。
from selenium import webdriver
# 导入ActionChains这个类
from selenium.webdriver.common.action_chains import ActionChains
import time
# 打开浏览器
driver = webdriver.Edge()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# 定位到设置
st_button = driver.find_element_by_id('s-usersetting-top')
# 设置鼠标悬停
# perform()执行前面的操作
# ActionChains(打开的浏览器对象,driver).move_to_element(悬停的元素).perform()
ActionChains(driver).move_to_element(st_button).perform()
四、键盘事件
- send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
- send_keys(Keys.SPACE) 空格键(Space)
- send_keys(Keys.TAB) 制表键(Tab)
- send_keys(Keys.ESCAPE) 回退键(Esc)
- send_keys(Keys.ENTER) 回车键(Enter)
- send_keys(Keys.CONTROL,’a’) 全选(Ctrl+A)
- send_keys(Keys.CONTROL,’c’) 复制(Ctrl+C)
- send_keys(Keys.CONTROL,’x’) 剪切(Ctrl+X)
- send_keys(Keys.CONTROL,’v’) 粘贴(Ctrl+V)
- send_keys(Keys.F1) 键盘 F1
- ……
- send_keys(Keys.F12) 键盘 F12
from selenium import webdriver
# Keys类才能调用键盘
from selenium.webdriver.common.keys import Keys
import time
# 打开浏览器
driver = webdriver.Edge()
driver.maximize_window()
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位输入框
serach_box = driver.find_element_by_id('kw')
# 输入内容
serach_box.send_keys("seleniummABC")
time.sleep(3)
# 删除多余的m 调用的删除键
# Keys.BACK_SPACE只能删除一个字母,要删除多个字母,则需要乘机
serach_box.send_keys(4*Keys.BACK_SPACE)
五、获取断言信息
断言其实就是为了判断这个操作是否成功,
-
通过文本信息
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 打开浏览器 driver = webdriver.Edge() driver.maximize_window() driver.implicitly_wait(10) # 打开网页 driver.get("http://www.baidu.com") # 定位搜索框 serach_box = driver.find_element_by_id('kw') # 输入内容 serach_box.send_keys("python") # 调用回车键 serach_box.send_keys(Keys.ENTER) time.sleep(3) # 回去搜索出来的第一页的所有内容标题 # find_elements_by_xpath 如果定位元素的方法显示的是elements,多个元素存在一个列表中 titles = driver.find_elements_by_xpath('//div[@id="content_left"]//h3') # 由于获取的结果是一个列表,要获取内容,则必须遍历列表,一个一个获取 for t in titles: # 获取文本信息 print(t.text)
-
根据title信息做断言
driver.title :网页标题
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 打开浏览器 driver = webdriver.Edge() driver.maximize_window() driver.implicitly_wait(10) # 打开网页 driver.get("http://www.baidu.com") # 定位搜索框 serach_box = driver.find_element_by_id('kw') # 输入内容 serach_box.send_keys("python") # 调用回车键 serach_box.send_keys(Keys.ENTER) time.sleep(3) # 获取网页标题 python_百度搜索 print(driver.title)
-
根据url判断
driver.current_url:当前网页的url
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 打开浏览器 driver = webdriver.Edge() driver.maximize_window() driver.implicitly_wait(10) # 打开网页 driver.get("http://www.baidu.com") # 定位搜索框 serach_box = driver.find_element_by_id('kw') # 输入内容 serach_box.send_keys("python") # 调用回车键 serach_box.send_keys(Keys.ENTER) time.sleep(3) # 获取网页标题 python_百度搜索 # print(driver.title) # 获取当前网页的url print(driver.current_url)
六、设置元素等待
为了解决页面加载太慢,而代码执行过快,元素定位不到的问题
-
强制等待
time.sleep(4) 这个是python中自带的日期时间模块完成的
-
隐式等待
driver.implicitly_wait(10)
隐式等待,指针之后的页面所有内容都有效,上面写了10,指的是10s,判断如果某个元素没有加载出来,最大超时时间是10s,
如果在 第4s就加载出来,那就继续往后执行
-
显示等待
显示等待设置的时候,需要是给每一个元素单独设置,偶尔有个元素由于业务需要加载时间比较长,则可以给其单独设置显示等待
from selenium import webdriver
from selenium.webdriver.common.keys import Keys在显示等待的时候,元素定位方式需要使用By加载
from selenium.webdriver.common.by import By
设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECimport time
打开浏览器
driver = webdriver.Edge()
driver.maximize_window()隐式等待
driver.implicitly_wait(10)
打开网页
driver.get(“http://www.baidu.com“)
-
"""
WebDriverWait(浏览器driver, 最大超时时间, 轮询时间)
EC.presence_of_element_located() 里面接受的是元素定位方式和具体的表达式,要使用元组的形式传入
By.ID指的就是.find_element_by_id('kw')
"""
# 定位搜索框
serarch_obj = WebDriverWait(driver, 5, 0.6).until(EC.presence_of_element_located((By.ID,'kw')))
# 输入内容
serarch_obj.send_keys("hello")
# 设置提交
# serarch_obj.submit()
serarch_obj.send_keys(Keys.ENTER)
隐式等待与显式等待的区别总结
在 Python 的 Selenium WebDriver 中,显示等待(Explicit Wait)和隐式等待(Implicit Wait)是两种不同的等待机制,它们用于处理网页元素加载的时间问题。以下是它们的主要区别:
隐式等待(Implicit Wait)
- 全局设置:隐式等待是全局性的,一旦设置,它将影响 WebDriver 实例的整个生命周期。
- 单一条件:它只等待某个单一条件成立,通常是等待元素出现,但不关心元素是否可交互。
- 设置方式:通过 WebDriver 实例的
implicitly_wait()
方法设置。 - 使用场景:适用于只需要等待元素出现的场景。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待最多等待10秒
显示等待(Explicit Wait)
- 局部设置:显示等待是局部性的,每次调用
WebDriverWait
都是独立的。 - 灵活条件:它允许等待多个条件,例如元素可点击、元素可见、元素选中等。
- 设置方式:通过
WebDriverWait
类和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()
wait = WebDriverWait(driver, 10) # 显示等待最多等待10秒
element = wait.until(EC.element_to_be_clickable((By.ID, 'myButton'))) # 等待直到按钮可点击
总结
- 隐式等待:简单,适用于所有元素,但不够灵活。
- 显示等待:灵活,可以等待复杂的条件,但需要更多的代码。
在实际应用中,推荐使用显示等待,因为它提供了更多的控制和灵活性,可以更精确地等待页面的特定状态,从而编写更稳定和可靠的自动化测试脚本。
七、多窗口切换
浏览器打开的窗口其实会有一个叫句柄的概念。句柄就类似于每一个标签页的id一样,是唯一的
方式一:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 打开浏览器
driver = webdriver.Edge()
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 搜索
obj = driver.find_element_by_id('kw')
obj.send_keys("马蓉")
# 回车
obj.send_keys(Keys.ENTER)
# 获取标签页句柄
windowhandle = driver.current_window_handle
print(windowhandle)
# 点击 马蓉百度百科
driver.find_element_by_xpath('//div[@id="content_left"]/div[2]//h3/a').click()
# 强制等待
time.sleep(3)
# 获取当前浏览器的所有窗口的句柄,获取回来的窗口句柄放在了一个列表中
headles = driver.window_handles
print(headles)
# 根据句柄进行切换
for head in headles:
# 如果窗口句柄,不等于打开的第一句柄,则就是第二个
if head != windowhandle:
driver.switch_to.window(head)
# 点击 编辑 按钮
driver.find_element_by_xpath('//dd[@data-pid="0"]/a[2]').click()
方式二:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 打开浏览器
driver = webdriver.Edge()
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 搜索
obj = driver.find_element_by_id('kw')
obj.send_keys("马蓉")
# 回车
obj.send_keys(Keys.ENTER)
# 点击 马蓉百度百科
driver.find_element_by_xpath('//div[@id="content_left"]/div[2]//h3/a').click()
# 强制等待
time.sleep(3)
# 获取当前浏览器的所有窗口的句柄,获取回来的窗口句柄放在了一个列表中
headles = driver.window_handles
print(headles)
# 根据下标进行句柄切换,获取回来的时候,窗口的句柄是一个列表,列表下标为-1的元素则是最新打开的窗口句柄,下标为0的是第一个
driver.switch_to.window(headles[-1])
# 点击 编辑 按钮
driver.find_element_by_xpath('//dd[@data-pid="0"]/a[2]').click()
八、表单切换
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Edge()
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("https://mail.163.com/")
# iframe表单切换
'''
switch_to.frame() 中默认可以写 该iframe标签的id和name属性的值,但是id和name要唯一
还可以通过其他的定位方式,定位到该iframe标签,然后将定位到iframe标签对象传入给switch_to.frame()
'''
# 通过xpath的方式定位iframe标签
iframe_element = driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe')
# 切换
driver.switch_to.frame(iframe_element)
time.sleep(3)
# 定位邮箱输入框 auto-id-1650273027369
driver.find_element_by_css_selector('input[name="email"]').send_keys("Auguses")
# 密码
driver.find_element_by_css_selector('input[name="password"]').send_keys("waedwaeds")
# 点击 登录 按钮
driver.find_element_by_id('dologin').click()
time.sleep(2)
# 由于上面登录的时候邮箱和密码,是在内存子页面中,所以通过iframe已经切换进去了,而 vip 又在最外层页面,所以要切换到最外层
driver.switch_to.default_content()
# 点击 vip
driver.find_element_by_css_selector('a[href="https://vipmail.163.com/?from=fmail"]').click()