一、元素操作
1.1.为什么要学习操作元素的方法?
1).需要让脚本模拟用户给指定元素输入值
2).需要让脚本模拟人为删除元素的内容
3).需要让脚本模拟点击操作
1.2.元素常用操作方法
1).click()点击方法
2).send_keys(value) 输入方法
3).clear() 清空方法
1.3.提示
1).在输入方法之前,要进行清空操作
1.4.代码
# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://baidu.com/")
# 百度搜索框 输入内容
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("美团招聘")
# 点击百度一下按钮 进行搜索
driver.find_element(By.CSS_SELECTOR, "#su").click()
# 睡眠3秒钟
sleep(3)
# 百度搜索框 清空内容
driver.find_element(By.CSS_SELECTOR, "#kw").clear()
# 百度搜索框 输入内容
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("腾讯招聘")
# 点击百度一下按钮 进行搜索
driver.find_element(By.CSS_SELECTOR, "#su").click()
# 睡眠3秒钟
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
二、浏览器常用的操作API
2.1.常用方法
1).maximize_window()最大化浏览器窗口--->模拟浏览器最大化按钮
2).set_window_size(width,height)设置浏览器窗口大小--->设置浏览器宽、高(像素点)
3).set_window_position(x,y)设置浏览器窗口位置--->设置浏览器位置
4).set_window_rect(x,y,width,height)设置浏览器窗口位置和窗口大小---->set_window_size和set_window_position的并集
5).back()后退---->模拟浏览器后退按钮
6).forward()前进-->模拟浏览器前进按钮
7).refresh()刷新-->模拟浏览器F5刷新
8).close()关闭当前窗口-->模拟点击浏览器关闭按钮
9).quit()关闭浏览器驱动对象-->关闭所有程序启动的窗口
10).title获取页面title
11).current_ur获取当前页面URL
2.2.提示
1).driver.title和driver.current_url没有括号,应用场景:一般为判断上步操作是否执行成功
2).driver.maximize_windowO一般为前置代码,在获取driver后,直接编写最大化浏览器
3).dirver.refreshO应用场景:cookie会使用到
4).dirver.close0与driver.quitO的区别
1.close():关闭当前窗口
2.quit():关闭由driver对象启动的所有窗口
2.3.代码
# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://baidu.com/")
# # 设置浏览器窗口大小为 400,400
# driver.set_window_size(400,400)
#
# # 设置浏览器窗口位置在左上角
# driver.set_window_position(-100,100)
# 两者结合
# driver.set_window_rect(-100,100,400,400)
# # 暂停三秒钟
# sleep(3)
# 最大化浏览器
driver.maximize_window()
# 百度搜索框 输入内容
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("美团招聘")
# 百度一下按钮 进行搜索
driver.find_element(By.CSS_SELECTOR, "#su").click()
# 睡眠3秒钟
sleep(3)
# 后退到前一页
driver.back()
# 获取当前页面标题和url
print(driver.title)
print(driver.current_url)
# 暂停三秒钟
sleep(3)
# 前进到前一页
driver.forward()
# 暂停三秒钟
sleep(3)
# 刷新页面
driver.refresh()
# 暂停三秒钟
sleep(3)
# 后退到前一页
driver.back()
# 打开新闻
driver.find_element(By.CSS_SELECTOR, ".mnav.c-font-normal.c-color-t").click()
# 暂停三秒钟
sleep(3)
# 关闭当前窗口
driver.close()
# 睡眠3秒钟
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
三、获取元素信息
3.1.为什么要获取元素信息?
1).获取元素的文本
2).获取元素属性值
3).判断当前元素是不是为可见状态
3.2.获取元素信息常用方法
1).size 返回元素大小
2).text 获取元素的文本
3).get_attribute("xxx")获取属性值,传递的参数为元素的属性名
4).is_displayed()判断元素是否可见
5).is_enabled()判断元素是否可用
6).is_selected()判断元素是否选中,用来检查复选框或单选框是否被选中
3.3.提示
1).size、text:为属性,调用时无括号;如:xxx.size
2).get_attribute一般应用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确
3).is_displayed、is_enabled、is_selected 在特殊场景使用
3.4.代码
# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://ssl.zc.qq.com/v3/index-chs.html?type=0")
# 输出欢迎注册QQ的文本
print(driver.find_element(By.CSS_SELECTOR, "div[data-bind='visible: isQQ() || isQQMail() || isMail()'] div:nth-child(1)").text)
# 输出昵称框的大小
print(driver.find_element(By.CSS_SELECTOR, "#nickname").size)
# 判断密码框是否可用
# class ="password error"
print(driver.find_element(By.CSS_SELECTOR, "#password").get_attribute("class"))
# 判断用户协议是否被选中
print(driver.find_element(By.CSS_SELECTOR,"#agree").is_selected())
# 判断密码框是否可见
print(driver.find_element(By.CSS_SELECTOR, "#password").is_displayed())
# 判断密码框是否可用
print(driver.find_element(By.CSS_SELECTOR, "#password").is_enabled())
# 睡眠3秒钟
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
四、鼠标操作
4.1.为什么要操作鼠标?
1).现在Web产品中存在丰富的鼠标交互方式,作为一个web自动化测试框架,需要应对这些鼠标操作的应用场景
4.2.鼠标操作的方法
1).说明:在Selenium中将操作鼠标的方法封装在ActionChains类中
2).实例化对象:action=ActionChains(driver)
3).方法
3.1).context_click(element)右击--->模拟鼠标右键点击效果
3.2).double_click(element)双击--->模拟鼠标双击效果
3.3).drag_and_drop(source,target)拖动--->模拟鼠标拖动效果(移动端测试比较常用)
3.4).move_to_element(element)悬停--->模拟鼠标悬停效果
3.5).perform()执行--->此方法用来执行以上所有鼠标操作
1.说明:在ActionChains类中所有提供的鼠标事件方法,在调用的时侯所有的行为都存储在ActionChains对象中,而performO方法就是真正去执行所有的鼠标事件
2.强调:必须调用performO方法才能执行鼠标事件
4.3.提示
1).selenium框架中虽然提供了,右击鼠标方法,但是没有提供选择右击菜单的方法,可以通过发送快捷键的方式解决 (经测试,谷歌浏览器不支持)。
2).鼠标操作方法:必须调用preform()才能执行
4.4.代码
# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# # 打开页面
# driver.get("https://ssl.zc.qq.com/v3/index-chs.html")
#
# # 实例化鼠标对象
# action = ActionChains(driver)
#
# # 定位账号框右键,预期结果 出现选择
# action.context_click(driver.find_element(By.XPATH,"//*[@id='nickname']"))
#
# # 执行鼠标操作
# action.perform()
#
# # 睡眠2秒钟
# sleep(2)
#
# # 发送用户名 admin 并进行双击,预期结果:选中admin
# action.double_click(driver.find_element(By.XPATH,"//*[@id='nickname']").send_keys("admin"))
#
# # 执行鼠标操作
# action.perform()
#
# # 睡眠2秒钟
# sleep(2)
#
# # 移动到在“简体中文”,出现提示框
# action.move_to_element(driver.find_element(By.XPATH,"/html/body/div[2]/div/div[2]/div/div/div[2]/div/div/div[1]/span"))
#
# # 执行鼠标操作
# action.perform()
#
# # 睡眠2秒钟
# sleep(2)
#
# # 关闭浏览器
# driver.quit()
# 打开网页
driver.get("https://ad.shenshiads.com/?bd_vid=11692342316616849961")
# 实例化鼠标对象
actions = ActionChains(driver)
# 定位到可拖动的东西并进行拖动(此方法通过坐标偏移量执行)
actions.drag_and_drop_by_offset(driver.find_element(By.XPATH,"//*[@id='aff-im-root']/div[2]/div/div/div[1]"),xoffset=200,yoffset=180).perform()
if __name__ == '__main__':
main()
五、键盘操作
5.1.说明
1).模拟键盘上一些3按键或者组合键的输入如:Ctrl+C、Ctrl+V
2).selenium中把键盘的按键都封装在Keys类中
5.2.Keys类
1).导包:From selenium.webdriver.common.keys import Keys
5.3.常用的键盘操作
1).send_keys(Keys.BACK_SPACE)删除键(BackSpace)
2).send_keys(Keys.SPACE)空格键(Space)
3).send_keys(Keys.TAB)制表键(Tab)
4).send_keys(Keys.ESCAPE)回退键(Esc)
5).send_keys(Keys.ENTER)回车键 (Enter)
6).send_keys (Keys.CONTROL,'a)全选 (Ctrl+A)
7).send_keys (KeyS.CONTROL,'c)复制(Ctr1+C)
5.4.提示
1).单键:send_keys(Keys.XXXX)
2).组合键:send_keys(KeyS.XXXX,'x)
5.5.代码
# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common import keys
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://ssl.zc.qq.com/v3/index-chs.html?type=0")
# 昵称框输入admin1
driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("admin1")
# 暂停三秒钟
sleep(3)
# 昵称框删除 1 执行一次删除键(相当于敲了一次)
driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys(Keys.BACK_SPACE)
# 暂停三秒钟
sleep(3)
# 昵称框全选 ctrl+a
driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys(Keys.CONTROL,"a")
# 暂停三秒钟
sleep(3)
# 昵称框复制 ctrl+c
driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys(Keys.CONTROL,"c")
# 暂停三秒钟
sleep(3)
# 粘贴在密码框
driver.find_element(By.CSS_SELECTOR, "#password").send_keys(Keys.CONTROL,"v")
# 睡眠3秒钟
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
六、元素等待
6.1.概念
1).在定位页面元素时如果未找到,会在指定时间内一直等待的过程
6.2.为什么要设置元素等待?
1).网络速度慢
2).电脑配置低
3).服务器处理请求慢
6.3.元素等待类型
1).隐式等待
1.1).概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待:如果不能定位到该元素,则间隔一段时间后再去定位元素:如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException
1.2).实现方式:driverimpicitly_wait(timeout)--->timeout:为等待最大时长,单位:秒
1.3). 说明
1.隐式等待为全局设置(只需要设置一次,就会作用于所有元素)
2.一般情况下为前置必写代码
1.4).代码
# 导包
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://baidu.com/")
# 网页最大化
driver.maximize_window()
# 隐式等待 设置十秒钟,抛出异常
driver.implicitly_wait(10)
# 百度搜索框 输入内容 设置一个错误异常,直接报错,说明等待失效
driver.find_element(By.CSS_SELECTOR, "#w").send_keys("美团招聘")
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
2).显式等待
2.1).概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待:如果不能定位到该元素,则间隔一段时间后再去定位元素:如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException。
2.2).在Selenium中把显式等待的相关方法封装在WebDriverWait类中
2.3).实现方式
1.导包等待类-->from selenium.webdriver.support.wait import WebDriverwait
2.实例化 WebDriverwait(driver, timeout, poll_frequency=0.5)
(1).driver:浏览器驱动对象
(2).timeout:超时的时长,单位:秒
(3).poll_frequency:检测间隔时间,默认为0.5秒
3.调用方法until(method):直到..时
(1).method:函数名称,该函数用来实现对元素的定位
(2).一般使用匿名函数来实现:lambda x:x.find_element(By.ID,userA")
(3).x为driver,它是WebDriverWait类将传入的driver赋值给类self_driver,until方法调用了self_driver;
4.element = WebDriverWait(driver, 10, 1).until(lambda x:x.find_element(By.ID,"userA")
2.4).提示
1.WebDriverWait(driver, 10,poll_frequency=0.5).until(lambdax:x.find_element(By.CSS_SELECTOR,"#kw"))返回的是一个元素
2.5).代码
# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
def main():
# 打开页面
driver.get("https://baidu.com/")
# 网页最大化
driver.maximize_window()
# 实例化显式等待类
# 注意:调用until方法返回的一定是一个元素
# 注意:此时element还不是元素,只有代码运行起来才是元素
element = WebDriverWait(driver, 10,poll_frequency=0.5).until(lambda x:x.find_element(By.CSS_SELECTOR,"#kw"))
# 输入值
element.send_keys("美团招聘")
# 暂停三秒钟
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
main()
6.4.显式等待与隐式等待的区别
1).显式等待针对单个元素生效
2).隐式等待针对全局元素生效