Selenium除了在爬虫的时候,可以模拟登陆操作,在自动化测试中也有一定的使用价值。下面列举常用操作。
文章目录
Selenium的准备工作
相关名词解释,点击此处
安装selenium
pip install selenium
配置chromedriver
1.下载chromedriver,下载地址
根据Chrome浏览器版本(查看版本:在浏览器中输入:chrome://version/)下载对应的chromedriver,没找到就找最近的版本。
2.解压安装包,得到exe文件。
3.把exe文件放到Chrome目录下,我的是:C:\Users\YYX\AppData\Local\Google\Chrome\Application
4.把exe文件放到python目录下,我的是:F:\Python\Python37
5.添加环境变量
Selenium的常用操作
声明浏览器对象
from selenium import webdriver
driver = webdriver.Chrome() #谷歌 需要配合:ChromeDriver驱动
driver = webdriver.PhantomJS() #无界面浏览器
driver = webdriver.FireFox() #火狐 需要配合:GeckoDriver驱动
driver = webdriver.Edge()
driver = webdriver.Safari()
访问页面
from selenium import webdriver
#driver = webdriver.PhantomJS()
driver = webdriver.Chrome()
driver.get("http://www.taobao.com")
# 输出页面
print(driver.page_source)
#driver.close()
运行后,会自动弹出Chrome浏览器,运行结果。
查找节点(元素定位)
获取单个节点的方法:
- find_element(By.ID,“kw”) #找到id属性为kw的节点
- find_element_by_id(“kw”) #找到id属性为kw的节点
- find_element_by_name(“kw”) #找到name属性为kw的节点
- find_element_by_xpath("//*[@id=‘q’]") #找到符合xpath格式的节点
- find_element_by_link_text(“kw”) #找到超链接文字为kw的节点
- find_element_by_partial_link_text(“kw”)#找到超链接文字含有kw的节点
- find_element_by_tag_name(“kw”) #找到tag属性为kw的节点(最好不用)
- find_element_by_class_name(“kw”) #找到class属性为kw的节点
- find_element_by_css_selector(“span.bg.s_btn_wr>input#su”)#定位到一个class名为bg s_btn_wr的span标签,在这个标签下面有一个id为su的input标签
获取节点信息:
#获取id属性值为aa的节点(logo)
object1= driver.find_element_by_id("aa")
print(object1) #输出节点对象
print(object1.get_attribute('class')) #节点的class属性值
print(object1.text) #获取节点间内容
print(object1.id) #获取id属性值
print(object1.location) #节点在页面中的相对位置
print(object1.tag_name) #节点标签名称
print(object1.size) #获取节点的大小
控制节点(交互)
from selenium import webdriver
import time
#创建浏览器对象
driver = webdriver.Chrome()
driver.get("http://www.taobao.com")
#获取id属性值等于q的节点对象
input = driver.find_element_by_id("q")
#模拟键盘输入python
input.send_keys('python')
time.sleep(1)
#清空输入框
input.clear()
#模拟键盘输入css
input.send_keys('css')
#获取搜索按钮节点,触发点击动作
driver.find_element_by_class_name("btn-search").click()
#driver.close()
执行js
#执行javascript程序将页面滚动移至底部
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
#执行javascript实现一个弹框操作
driver.execute_script('window.alert("Hello Selenium!")')
切换Frame
有一种节点叫做iframe,可以将一个页面分成多个子父界面。
我们可以使用switch_to.frame()来切换Frame界面。
driver.switch_to.frame('iframeResult')
动态链(模拟操作)
ActionChains是一种自动化低级别交互的方法,如鼠标移动,鼠标按钮操作,按键操作和上下文菜单交互。
这对于执行更复杂的操作(如悬停和拖放)很有用.
- move_to_element(to_element )-- 将鼠标移到元素的中间
- move_by_offset(xoffset,yoffset )-- 将鼠标移至当前鼠标位置的偏移量
- drag_and_drop(源,目标)-- 然后移动到目标元素并释放鼠标按钮。
- pause(秒)-- 以秒为单位暂停指定持续时间的所有输入
- perform()-- 执行所有存储的操作。
- release(on_element = None )释放元素上的一个持有鼠标按钮。
- reset_actions()-- 清除已存储在远程端的操作。
- send_keys(* keys_to_send )–将键发送到当前的焦点元素。
- send_keys_to_element(element,* keys_to_send )-- 将键发送到一个元素
例子:
#获取两个div节点对象
source = driver.find_element_by_css_selector("#draggable")
target = driver.find_element_by_css_selector("#droppable")
#创建一个动作链对象
actions = ActionChains(driver)
#将一个拖拽操作添加到动作链队列中
actions.drag_and_drop(source,target)
time.sleep(3)
#执行所有存储的操作(顺序被触发)
actions.perform()
#driver.close()
延迟等待
浏览器加载需要时间的,Selenium也不例外,若要获取完整网页内容,就要延时等待。
在Selenium中延迟等待方式有两种:一种是隐式等待,一种是显式等待(推荐)。
隐式等待:
driver.implicitly_wait(2)
显式等待:
#显式等待,最长10秒
wait = WebDriverWait(driver,10)
#等待条件:10秒内必须有个id属性值为zu-top-add-question的节点加载出来,否则抛异常。
input = wait.until(EC.presence_of_element_located((By.ID,'zu-top-add-question')))
print(input.text) #获取节点间内容
前进和后退
用于返回上一步或者跳到下一步,类似浏览器的返回上一界面下一界面。
driver.back() #后退
driver.forward() #前进
Cookies
from selenium import webdriver
from selenium.webdriver import ActionChains
#创建浏览器对象
driver = webdriver.Chrome()
#加载请求指定url地址
driver.get("https://www.zhihu.com/explore")
print(driver.get_cookies())#得到所有的cookies
#添加cookies
driver.add_cookie({'name':'namne','domain':'www.zhihu.com','value':'zhangsan'})
print(driver.get_cookies())
driver.delete_all_cookies()#删除所有的cookies
print(driver.get_cookies())
#driver.close()
选项卡操作
driver.get("https://www.baidu.com")
#使用JavaScript开启一个新的选型卡
driver.execute_script('window.open()')
#切换到第二个选项卡,并打开url地址
driver.switch_to_window(driver.window_handles[1])
driver.get("https://www.jd.com")
#切回到第一个选项卡,并打开url地址
driver.switch_to_window(driver.window_handles[0])
driver.get("https://www.taobao.com")
异常处理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
driver = webdriver.Chrome()
# 超时错误
try:
driver.get("https://www.baidu.com")
except TimeoutException:
print('Time Out')
# 未找到节点错误
try:
#加载请求指定url地址
driver.find_element_by_id("demo")
except NoSuchElementException:
print('No Element')
finally:
pass