最近工作需要,利用华为路由器和TP-Link交换机,临时搭建了一个基于4G网络的局域网,为了可以在后台及时将流量断开节省流量,特别研究了一下pyhon中对浏览器的模拟。
模拟架构是 python + selenium + EdgeDriver/PhandomJS
其中,Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。
python 的Selenium支持包 可以直接在CMD中运行以下命令来完成安装:
python -m pip install selenium
解压,cmd进入目录:
C:\selenium\selenium2.53.5> python3 setup.py install
PhandomJS简介:
(1)一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。
(2)提供javascript API接口,即通过编写js程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。
(3)提供windows、linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。
简单来说,PhandomJS就是一个没有界面的浏览器,它可以帮助python完成浏览器需要完成的工作。
至此,我们就可以干活了,但PhandomJS没有界面也限制了我们进行实时调试。
为了辅助进行调试,我们需要安装一个浏览器的driver,我主机用的是win10 系统的Edge浏览器,在微软官方网站有Edge webdriver的下载链接,下载好就是一个exe文件,添加到系统的PATH环境变量中,或者和编写的py脚本放在同一个目录下,就OK了。
Edge webdriver的下载链接:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
有了它,我们可以用脚本网上冲浪了!
先上代码:
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
def main():
#driver = webdriver.Edge()
driver = webdriver.PhantomJS(executable_path="phantomjs.exe")
driver.get("http://192.168.20.1/html/home.html")
elem_login_edge = driver.find_element_by_id("logout_span")
elem_login_edge.click()
driver.find_element_by_id("username").send_keys("admin")
driver.find_element_by_id("password").send_keys("qatest")
driver.find_element_by_id("pop_login").click()
print("waiting for login...")
time.sleep(2)
print("OK!")
driver.find_element_by_id("mobile_connect_btn").click()
#driver.quit()
if __name__ == '__main__':
main()
driver.get() 调用路由器登录界面。定位到登录按钮,登录按钮的HTML代码的id栏是logout_span,所以用find_element_by_id("ID")可以定位到该按钮。click()方法模拟鼠标单击,现在浏览器已经打开了登录界面,重新在HTML代码中分别定位 username和password,并调用send_keys()方法可以将用户名和密码填入文本框中。
最后定位登录按钮(pop_login),并单击,就完成了模拟登录的过程。
一开始并没有添加sleep指令,结果内核解析不到链接控制按钮,这里让系统等待2秒和web交互,然后就可以定位到这个按钮了,单击即可连接或者断开4G网络。
整体来讲还是比较简单的,对于这种JS框架进行登录的模式,用模拟浏览器的方式比较方便,但实际操作中,感觉效率一般,内核加载似乎时间比较长。