UI自动化中上传与唤醒弹窗
一.是否有必要唤醒弹窗
以selenium为代表的库在进行文件上传时,是可以直接对输入框 “发送” 文件的,其send_keys()方法本身不光意味着输入内容,还包括上传文件哦。上传文件的页面元素通常是以 input 标签出现,对其输入文件路径即可。
其它的库也有类似的方法,如 playwright 也有这种方法。
但是,并不是每一个文件上传都可以使用 send_keys() 方法的。只是在没必要唤醒弹窗的时候就不唤醒,毕竟用 send_keys() 方法能省去很多麻烦。
二.必须唤醒弹窗
在遇到 send_keys() 方法无法对文件进行上传时,这时首先检查一下元素是否正确,若确定元素没问题还是唤不醒,说明对方的网站对输入框做了一些防爬工作,不过没关系,可以用 click() 进行唤醒。
几乎每个ui自动化库都有 click() 方法,对于它的使用我无需多言。需要注意的是,点击操作分为很多种,除了内置的 click() 外,还有对 js 操作的click(),通常表现为 execute_js("arguments[0].click();") 的形式,同样的,很多ui自动化库都有该方法,除此之外,还有鼠标方法 mouse_down() 也能实现点击,基于键盘的点击 ctrl+o 等等。
在实际工作中,基于 js 的点击和键盘的方法确实起到很大作用。但他们不是百分之百有效的,我还真的遇到过什么方法都用尽了,还是无法唤醒弹窗的情况,真的很头疼。
三.选对库很重要
尽管不少人吐槽selenium,但在ui自动化领域中它仍是最优选择,掌握它的一些封装很重要,这是你的程序稳定性的关键。
读过我之前博客的朋友知道seliky库是我对它的封装,个人还算满意的库,喜欢的话可以 pip install seliky 来安装它。
工作迫使我不停地追求更好的解决方案,百度谷歌早已翻了个底朝天,最后还是承认,还得是selenium,其次选择 clicknium 吧,除此之外,都没什么用。恕我直言,真没什么用。
selenium和clicknium能解决绝大多数ui自动化中的问题,其中肯定包括 上传无法唤醒弹窗 的问题,还有 臭名昭著的防selenium反爬 的问题,总之一切selenium被针对了的问题,用clicknium几乎都能搞定。
四.上传交互
除了原生的send_keys()方法外,上传只能通过唤醒窗口的方式进行。
基于windows的电脑对上传有相关的支持,其它的系统简直一言难尽,在此不便多述。
不少朋友知道 autoit 这个东西,它可以制作一个上传器,来为 唤醒的窗口 实现界面的上传交互。读过我之前博客的朋友知道我写过一个很nb的上传器,解决了谷歌浏览器、火狐浏览器的文件上传的各种问题。但是比较它是一个exe程序,不太pythonic,所以后来我换成了更优雅的方式。
所以,uploads库应运而生,这是我写得自认为比较满意的库,喜欢的朋友可以 pip install uploads 来安装。
这样,以windows为代表的上传交互 解决了,仿佛一切安好。
五.业务died
就在今天,我的某条自动化爬虫相关的子业务线死了。虽然它相对而言不算主业务,但我还是很伤心。
归其原因,是因为连clicknium也无法唤醒弹窗,这导致没法上传我们的海量资源到对方网站。除此之外的ui自动化技术已经没有可用的了,这也是职业生涯中脑细胞死得比较多的一次。像是行走到了神经的末梢,已然穷途末路,或许降维打击可以奏效,开辟新的十字路口才是全新的视角。如果产品能够与对方网站协调好,或许能复活业务,但是没法协调,所以业务只能死。