Bootstrap

Python+Selenium——自动办公美梦的破碎与重建

在《半小时手工解决的活,让我意外学会了 python 的 pdfkit 库》这篇文章最后,

我说“知耻而后勇,我要学 selenium。”

原文:

1 自动化美梦破碎

在各类“9.9元掌握 Python”、“0元免费学”的广告里,经常有类似的描述和配图:

同样的公司,同样的岗位,相似的工作,但是小明发现当自己在夜色中加班时,自己的同事小红却经常早早下班。而且呢,小红的工作完成的准确率还很高。有一天,小明终于忍不住,去向小红讨教经验。这时,小红缓缓的说:“人生苦短,我用python”。然后附上了 Python 的入门目录和课程付费入口。

广告的思路没错,要想办法提高工作效率,减少重复性的劳动,把时间投入到有价值的地方上去。学习编程抛开学校里系统的理论与部分编程语言基础教学,还要结合业务、结合实践。这样学习才是最有效的,也是最不容易遗忘的。不过在尝试了 Selenium 以后,发现还是不能很好的解决批量打印 PDF 调整格式的问题。

2 运用工具的前提——熟悉业务逻辑

要带着明确的问题去做。如,我是要模拟什么操作,这项操作中,哪些部分是可以通过程序标准化执行的。先用 Jupyter 一行一行,边写边执行,然后测试单独的语句是否能正常运行。

然后再把它用函数或者类封装执行。

那么一般的办公系统里面,selenium 常用的操作有元素的定位、模拟鼠标点击、键盘快捷键的操作,这些都简单。难的是把要模拟的操作合理分块,不要乱了函数去调用。

3 重建——代码分享

(1) 导包

from selenium import webdriver   #自动化工具
from selenium.webdriver.common.by import By    #通过 By 定位元素
from selenium.webdriver.common.keys import Keys   #通过 Selenium send_keys传递值
#导入一个选择包
from selenium.webdriver.support.select import Select
import time   # 页面等待,避免没刷新出来报错
import re   # 正则表达式处理库

(2)登录函数,涉及到输入文本(sendkeys):

def login(username,passw):      # 传两个参数进来。

    url = '# url #'

    browser = webdriver.Chrome(r'.\chromedriver.exe')   # 所用谷歌浏览器对应版本的 chromedriver.exe 的绝对路径

    browser.get(url)

    #输入用户名:

    browser.findelement(By.ID, "username").sendkeys(username)   

    #输入密码:

    browser.findelement(By.ID, "userpassword").sendkeys(passw)

    #点击登录

    browser.findelement(By.CLASSNAME,'login100-form-btn').click()  

return browser

(3) 窗体切换函数:

def left_frame():

    # 从默认frame 跳到左边的frame

    driver.switch_to.default_content()

    driver.switch_to.frame(driver.find_element_by_xpath("//frame[contains(@src,'leftframe')]"))   #这里之前被卡过。元素选择不了,可能是因为窗体没定位对。
    
    
def main_frame():
    #要先返回默认的 frame
    # 再跳到右边的 frame
    driver.switch_to.default_content()
driver.switch_to.frame('mainContent')

(4)选择功能:

Select(driver.find_element_by_xpath('# 点击元素右键点 copy full xpath #')).select_by_value('item2') 

(5)进阶:

Xpath 的定位,一开始用默认的很长一串,然后通过尝试把长的缩短。

基本的用法是 :

// 表示从整个网页下选择所有的框。

/div[@class="XXX"] 表示选择 class 为“XXX”的 div 标签。

在 scrapy 用 response 取 Xpath 时,经常犯错:

节点要一级一级定位到最下面的一级,才可以提取文本。

(6)精进:

driver.find_element_by_

在这里我通常喜欢,按 tab 键,然后就可以看到很多种定位的方法。然后 help() 一下或者在 CSDN 社区里找一下。然后你就会从一个小口,精通各种定位方法。当然,也可以选择两三个常用的方法,容错性更大一点。

工具要用起来,才更有价值。

希望这篇文章对你有所启发。

元旦快乐!