写点什么

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

用户头像
小匚
关注
发布于: 2021 年 01 月 01 日
Python+Selenium——自动办公美梦的破碎与重建

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

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

原文:https://xie.infoq.cn/article/0ab081c3a8b95d28fdc3fcf9a


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 Selectimport 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 社区里找一下。然后你就会从一个小口,精通各种定位方法。当然,也可以选择两三个常用的方法,容错性更大一点。


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

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

元旦快乐!


发布于: 2021 年 01 月 01 日阅读数: 49
用户头像

小匚

关注

进一寸有进一寸的欢喜 2019.07.22 加入

喜欢玩 Python 和 写书摘 的女孩儿 见证我的成长-->微信公众号:小匚(fang,一声),等你来~

评论

发布
暂无评论
Python+Selenium——自动办公美梦的破碎与重建