selenium是一个自动化测试工具,之前实现自动购票的时候就用过,这里再学一遍。就是驱动浏览器执行操作,比如点击,输入,拖拽等等。
selenium下有对应很多浏览器的webdriver,例如
browser=webdriver.Chrome()#这里只要实例化,就会打开指定的浏览器
这样就实例化一个chrome浏览器对象。
然后请求网页,获取源代码。
browser.get('http://www.baidu.com')
print(browser.page_source)
browser.close()#关闭浏览器
获取单一节点的方法
find_element_by_id(name//xpath//css_selector)
获取多个节点的方法
find_elements_by_id(name//xpath//css_selector)
获取节点各字段的值
webelement.get_attribute(‘class’)
webelement.id(text//size//location)
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('http://www.baidu.com')
input=browser.find_element_by_id('kw')#找到输入框
input.send_keys('python')#输入
input.clear()#清空
input.send_keys('java')
enter=browser.find_element_by_id('su')#找到按钮
input.click()
动作链
实现拖拽
from selenium import ActionChains
browser.get('http://www.baidu.com')
browser.switch_to.iframe('iframeresult')#切换到子页面
#分别找到拖拽的起点和终点
start=browser.find_element_by_id('draggable')
end=browser.find_element_by_id('droppable')
action=ActioinChains(browser)#实例化动作
action.drag_and_drop(start,end)#指定功能
action.perform()#执行动作
execute_script()可以执行Js命令,例如
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
拖拽进度条到底。
切换frame
selenium打开网页后,默认在父页面里操作,不能直接获取到子页面的节点。
switch_to.iframe(‘iframeresult’)#切换到子页面
switch_to.parent_frame()#切换到父页面
延时等待
等待分三种,隐式等待,显式等待,强制等待
browser.implicitly.wait(10)
wait=WebDriverWait(browser,10)
time.sleep(10)
显式等待可以设置等待条件,在规定时间内满足条件才能通过。
from selenium import webdriver
from selenium.webdriver.common.by import By
#from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
wait=WebDriverWait(browser,10)#实例化等待对象
input=wait.until(EC.presence_of_element_located((By.ID,'q')))#传入等待条件‘出现id为q的节点’
button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))传入等待条件‘按钮可点’
print(input,button)
如果规定时间内没有满足等待时间,就报错TimeoutExcepton.
这里support.wait模块里也有WebDriverWait函数,调用它似乎结果一样。
前进后退
连续访问三个网页,执行后退和前进操作。
browser.get('http://www.baidu.com')
browser.get('http://www.taobao.com')
browser.get('http://www.zhihu.com')
browser.back()
browser.forward()
选项卡操作
browser.execute_script('window.open()')
print(browser.window_handles)#获取选项卡列表
browser.switch_to_window(browser.window_handles[1])#切换到第二个选项卡
browser.get('http://www.taobao.com')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
结果:
['CDwindow-115C8B8AFAC4EE5D41F1F38CEFE3D0F7']
['CDwindow-115C8B8AFAC4EE5D41F1F38CEFE3D0F7', 'CDwindow-7DDA99B1E3D5A7BC8DF5B92733C8BDE3']
['CDwindow-115C8B8AFAC4EE5D41F1F38CEFE3D0F7', 'CDwindow-7DDA99B1E3D5A7BC8DF5B92733C8BDE3']
异常处理
from selenium.common.exceptions import TimeException,NosuchElementException
常用的就是TimeException,NosuchElementException
cookies
browser.get_cookies()#获取该页面的cookies
browser.add_cookie()#添加cookie
browser.delete_cookies()#删除当前cookies