python selenium 初探

初探python selenium

做一些WEB相关的自动化处理,模块还是很好用的,之前一直针对某个单一页面进行特征比对判断及测试。使用了selenium后,感觉在自动化角度还有很大的空间。
目前自发主要用途比如免去加密登录的暴力破解;针对多级操作的流程处理等等。当然不仅局限于此。这个过程主要的报错就是XPATH定位时的Unable to locate element(无法定位到元素),其实主要的原因还是handle句柄的变化,以及部分页面的刷新时间的原因。

脚本初探总结如下:

最初的想法是自动批量提交成百上千的流程。
主要逻辑就是:

1. 访问oa首页,然后把cookie填充
2. 携cookie,访问待办事宜页面
3. 针对待办事宜的页面,进行div首元素查找并点击
4. 针对新页面的提交按钮进行点击

有几个注意点,值得归纳总结

1. 开启浏览器除了正常的模块引用,还要下载浏览器配对的webdirver,并置于环境变量能够引导的路径
2. 携带cookie访问,前提是先增加cookie进入,但不能直接访问目的页面。先访问下首页,然后add,然后再访问目的页面
3. cookie必须得是key value 形式,不能按照常规数据包那种json格式,使用这种格式:cookie ={'name':'JSESSIONID','value':'aaaZzzItnQOrm_T4ihLZv'}
4. 若操作行为出现点击,一般会有新的handle,所以要在新页面去查找元素,必须得使用switch(browser.switch_to_window(browser.window_handles[n]))
5. 由于各个页面的点击,可能加载缓慢,所以保证完全加载后再进行元素查找,所以可以使用time.sleep(2)
6. 原理上所有的网页元素可以通过xpath来表达,所以chrome可使用F12的审查元素来配套结合
7. xpath中若存在引号,必须使用\进行转义,否则不能正确引用
8. 这个过程最多的报错就是Unable to locate element (无法定位元素问题),主要原因只顾于对元素方法的定位,却没有意识到页面发生跳转后的handles的变化
    1. selenium 默认的handle 就是0 ,所以当点击按钮后出现的是新handle(也可理解为浏览器的新标签),若在新的标签中取值,必须得切换handle
    2. 为了循环处理循环体,还得把handle重归位为0(首页句柄),这样才能是新的开始,否则仍然按照新打开的handle去定位老元素,仍然会提示Unable to locate element
9. 关于浏览器页面和页签,可把开启打开访问置于循环体外面,针对浏览器标签的关闭可使用browser.close() , 针对浏览器整体的关闭可使用browser.quit()
10. 有几个用法:
    1. 打印输出当前handle:print browser.current_window_handle
    2. 打印输出所有handle:print browser.window_handles
    3. 打印输出当前cookie:print browser.get_cookies()
    4. 打印输出当前URL   :print browser.current_url

脚本demo如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#coding=utf-8
import time
from selenium import webdriver
def accessFBIOA(browser):
browser.get('https://oa.fbi.com.cn/')
cookie ={'name':'JSESSIONID','value':'aaaZzzItnQOrm_T4ihLZv'}
browser.add_cookie(cookie)
print browser.current_window_handle
print 'step 1 ok'
browser.get("https://oa.FBI.com.cn/vworkflow/workflow/workflowbaselist.jsp?action=searchall&isfinished=0&isnew=1&sqlwhere=operatetype%3E1")
time.sleep(1)
print browser.current_window_handle
print 'step 2 ok'
browser.find_element_by_xpath("//*[@id=\"datagrid-row-r1-2-0\"]/td[4]/div/a").click()
print browser.current_window_handle
print 'step 3 ok'
now_url = browser.current_url
time.sleep(1)
#第四步,定位提交按钮
try:
browser.switch_to_window(browser.window_handles[1])
browser.find_element_by_xpath("//button[@id='button_F']").click()
#print 'element has located'
#break
except:
print 'no focus'
print browser.current_window_handle
print 'step 4 ok'
browser.close()
#browser.quit()
#便于循环初始进行,所以要切换handle
browser.switch_to_window(browser.window_handles[0])
def main():
browser = webdriver.Chrome()
for i in range(1,3):
print "######Current Process",str(i),"######"
accessTassOA(browser)
if __name__ == '__main__':
main()