我们公司填写日志都是在web上登录OA进行填写,但是由于公司OA系统年岁已高 ,使用的时候非常卡顿,一般一个月的日志填写需要1个小时,有80%的时间都是在等待OA系统响应 ,实在是有点被烦到了,于是产生了开发一个日志自动填写脚本的想法,功能很简单 ,就是自己先在EXCEL中填好日志 ,然后按照格式自动读取EXCEL文件并填入OA,就可以不需要人再去点点点了。

  于是考虑使用python,selenium来编写脚本文件 ,基本思路是通过爬虫模仿人点击行为,一步步完成OA的填写过程 。

selenium的使用需要:

1.安装selenium的Python包。

  在anaconda prompt中安装selenium:

  pip install selenium

2.下载对应浏览器的Selenium Webdriver并配置到系统变量(PATH)。 

 

 不同的浏览器需要不同的webdriver,我这里用的是火狐浏览器 ,对应的webdriver是geckodriver,在GITHUB上能够找到WIN10系统的geckodriver下载地址,链接是 https://github.com/mozilla/geckodriver/releases 。

下载后将下载下来的GeckoDriver.exe放入python安装路径下的Scripts文件夹内 ,或者放在其他路径,然后将该路径加入环境变量。

随后可以在CMD中输入geckodriver来测试是否安装成功。如果成功了则会有如下提示:

 现在开始着手编写Python脚本代码,先需要明确人工填写日志的操作步骤 ,

日志的人工填写过程大致如下:

  1.登录OA

  2.选择计划管理-工作日志填写-右键点击我的工作-选择新建-并在弹出的窗口中填写日志文件信息

  3.保存日志文件,完成日志填写 。

 

 这个过程中大概需要有如下几类操作:  

  #启动和配置webdriver
  from selenium import webdriver #导入webdriver   browser = webdriver.Firefox() #启动浏览器配置,命名为browser ,这个browser可以看做是浏览器的遥控器   browser.get("http://XXXXXX") #将地址传给broswer

 

  1.选定按钮并单击鼠标左键 。

  browser.find_element_by_id("navigatetitle6").click()

  2.选定输入框并输入内容。

    browser.find_element_by_class_name("Wdate").send_keys(date)

  3.点击下拉对话框并选择对应项。

    Select(browser.find_element_by_name("finished")).select_by_value(status)

  4.选定元素并点击鼠标右键 ,在弹出的对话框中选定按钮并单击鼠标左键 。

  ActionChains(browser).context_click(browser.find_element_by_xpath("//div[@id = 'tree']/ul/li/a")).perform() #实现在元素上右键点击
  browser.find_element_by_xpath("//div[@id = 'vakata-contextmenu']/ul/li[1]/a").click() #实现在弹出的对话框中点击鼠标左键

 

其实总结起来,想用代码表示每一个人工操作步骤,不外乎都是元素定位+操作执行 ,具体来说步骤如下

  1.找到元素(按钮 、对话框、下拉框等)的html源代码

    通过F12打开 开发者模式 查看HTML源码,火狐浏览器可以用ctrl+shift+C选择需要定位的元素。

    元素通常包含id、name 、class等属性,可以通过这些属性来对元素进行定位 ,但这些属性可能存在重名,需要小心。

    

  2.元素定位

    webdriver 提供了一系列的对象定位方法,常用的有以下几种:

      id定位:find_element_by_id()

      name定位:find_element_by_name()

      class定位:find_element_by_class_name()

      link定位:find_element_by_link_text()

      partial link定位:find_element_by_partial_link_text()

      tag定位:find_element_by_tag_name()

      xpath定位:find_element_by_xpath()

      css定位:find_element_by_css_selector()

    其中 ,id定位、name定位、class定位 、xpath定位是最常用的几种,对于有id 、name、class等且不重名的元素,用对应的定位方法会更加便捷 ,但是有时元素不包含以上内容,则需要通过xpath进行定位 。

    

    在元素源代码单击右键->复制->Xpath可以得到该元素的Xpath,其类型如下:

    //*[@id="mce_fullscreen_ifr"] #对应有独立id的元素的Xpath
    /html/body/p[7] #对应无独立id的元素的Xpath
  另外 ,在元素定位的过程中 ,经常会出现明明有id、name,但是找不到元素的情况出现,这个问题通常是由于iframe导致的 ,必须要先切换到该元素对应的iframe下,再定位元素。
    

 

   比如我这里需要定位“工作日志填写”,id为sd91 ,那么我就需要先找到他所在的iframe,然后通过 browser.switch_to.frame()切换后,才能通过find_element_by_id()找到该元素。

   #如果存在多个iframe嵌套的情况	,则需要多次使用switch_to.frame来逐层切换
  browser.switch_to.frame("main_iframe")
  browser.switch_to.frame(
"viewFrame")
  #完成元素定位和操作后,有可能需要返回顶层的frame,使用如下语句可实现:
  browser.switch_to.default_content()

 

  3.执行操作

  回到刚才的几类操作的源代码:  

  1.选定按钮并单击鼠标左键:通过click()实现 。

    browser.find_element_by_id("navigatetitle6").click()

  2.选定输入框并输入内容:通过send_keys()实现。

    browser.find_element_by_class_name("Wdate").send_keys(date)

  3.点击下拉对话框并选择对应项:

  遇到下拉框选择时 ,Selenium专门提供了Select类来处理下拉框,通常有三种选择方法。

    select.select_by_index(1) #index 索引从 0 开始
select.select_by_value("0") #value是option标签的一个属性值,并不是显示在下拉框中的值 select.select_by_visible_text(u"xxx") #visible_text是在option标签文本的值 ,是显示在下拉框的值

 

   # 导入 Select 类 
  from selenium.webdriver.support.ui import Select


  # 执行下拉操作并根据下拉框中的值来确定选项
  Select(browser.find_element_by_name("finished")).select_by_value(status)

  4.选定元素并点击鼠标右键 ,在弹出的对话框中选定按钮并单击鼠标左键:

  这里需要导入Selelium中的ActionChains类,该类常用于模拟鼠标的行为,比如单击 ,双击,右键,拖拽等行为 。这个类还很不熟练 ,后面再补学。

  #导入ActionChains类
  from selenium.webdriver import ActionChains

  #实现在元素上右键点击
  ActionChains(browser).context_click(browser.find_element_by_xpath("//div[@id = 'tree']/ul/li/a")).perform()
  #实现在弹出的对话框中点击鼠标左键
  browser.find_element_by_xpath("//div[@id = 'vakata-contextmenu']/ul/li[1]/a").click()

 

文章来源于网络,如有侵权请联系站长QQ61910465删除
本文版权归qu快排seo www.sEoguRuBlog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ√61910465