Python - Selenium
Selenium Python 官网
安装 Selenium
# python 2+ pip install selenium # python 3+ pip3 install selenium
转载自:莫凡Python 高级爬虫: 让 Selenium 控制你的浏览器帮你爬
driver
要操控浏览器, 你就要有浏览器的 driver. Selenium 针对几个主流的浏览器都有 driver. 针对 Linux 和 MacOS.
Linux 和 MacOS 下载好之后, 将下载好的”geckodriver” 或者 “chromedriver ”文件放在计算机的 “/usr/bin” 或 “/usr/local/bin” 目录. 并赋予执行权限
sudo cp 你的geckodriver位置 /usr/local/bin
sudo chmod +x /usr/local/bin/geckodriver
火狐浏览器插件
暂时只有火狐上有这个插件. 插件 Katalon Recorder 下载的网址在这
这个插件能让你记录你使用浏览器的操作.
![](https://img2018.cnblogs.com/blog/1152413/201811/1152413-20181128202621706-1453841964.png)
安装好火狐上的这个插件后, 打开它.
找到插件上的 record, 点它. 开始你的各种点击工作, 比如我的一连串操作是 (强化学习教程->About页面->赞助页面->教程->数据处理->网页爬虫)
虽然这个代码输出只有 Python2 版本的, 不过不影响. 我们直接将这些圈起来的代码复制. 这将会是 python 帮你执行的行为代码.
Python 控制浏览器
开始写 Python 的代码了. 这里十分简单! 我将 selenium 绑定到 Chrome 上 webdriver.Chrome()
. 你可以绑其它的浏览器.
from selenium import webdriver driver = webdriver.Chrome() # 打开 Chrome 浏览器 # 将刚刚复制的帖在这 driver.get("https://morvanzhou.github.io/") driver.find_element_by_xpath(u"//img[@alt='强化学习 (Reinforcement Learning)']").click() driver.find_element_by_link_text("About").click() driver.find_element_by_link_text(u"赞助").click() driver.find_element_by_link_text(u"教程 ▾").click() driver.find_element_by_link_text(u"数据处理 ▾").click() driver.find_element_by_link_text(u"网页爬虫").click() # 得到网页 html, 还能截图 html = driver.page_source # get html driver.get_screenshot_as_file("./img/sreenshot1.png") driver.close()
我们可以让 selenium 不弹出浏览器窗口, 让它”安静”地执行操作. 在创建 driver
之前定义几个参数就能摆脱浏览器的身体了.
from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") # define headless driver = webdriver.Chrome(chrome_options=chrome_options) ...
Selenium 能做的事还有很多, 比如填 Form 表单, 超控键盘等等. 欢迎点进去他们的 Python 教学官网.
最后, Selenium 的优点可以很方便的帮你模拟你的操作, 添加其它操作也是非常容易的, 但是也是有缺点的, 不是任何时候 selenium 都很好. 因为要打开浏览器, 加载更多东西, 它的执行速度肯定没有其它模块快. 所以如果你需要速度, 能不用 Selenium, 就不用吧.
相关教程
参考:selenium-webdriver系列博客
selenium-webdriver 处理JS弹出对话框
参考链接:http://www.cnblogs.com/mengyu/p/6952774.html
在实际系统中,在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框。
1.警告消息框(alert)
警告消息框提供了一个"确定"按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先关闭该消息框然后才能继续进行操作。
2.确认消息框(confirm)
确认消息框向用户提示一个"是与否"问题,用户可以根据选择"确定"按钮和"取消"按钮。
3.提示消息对话(prompt)
提示消息框提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个"确定"按钮和一个"取消"按钮。选择"确认"会响应对应的提示信息,选择"取消"会关闭对话框。
selenium 提供switch_to_alert()方法定位到 alert/confirm/prompt对话框。使用 text/accept/dismiss/send_keys 进行操作,这里注意的是send_keys只能对prompt进行操作。
- switch_to_alert() #定位弹出对话
- text() #获取对话框文本值
- accept() #相当于点击"确认"
- dismiss() #相当于点击"取消"
- send_keys() # 输入值,这个alert和confirm没有输入对话框,所以这里就不能用了,所以这里只能使用在prompt这里。
driver = webdriver.Chrome(chrome_options=chrome_options) driver.get(node_url) try: alret = driver.switch_to_alert() # 定位弹出对话 while alret: time.sleep(1) alret.dismiss() # 点击"取消" alret = driver.switch_to_alert() except Exception as e: traceback.print_exc() # print("-------------无广告!!!---------") pass
selenium-webdriver 元素定位
参考链接:https://www.cnblogs.com/mengyu/p/6876294.html
selenium 提供了8中元素定位的方法(大家要学习元素的定位,首先可以学习下前端的基础知识,这样有利于我们学习自动化测试,大家可以看一下:http://www.runoob.com/)
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
1.通过先定位到具体的元素然后通过text方法获取文本信息,如获取控件名称等
driver.find_element_by_xpath("//div[/h1").text
2.直接通过定位到的元素的属性直接获取属性名称,如输入框提示信息等
driver.find_element_by_id("XXX").get_attribute(YYY)
driver = webdriver.Chrome() #最大化窗口 driver.maximize_window() # 等待一定时间,让js脚本加载完毕 driver.implicitly_wait(10) driver.get("https://v.qq.com/") driver.find_element_by_xpath("//a[@id='mod_head_notice_trigger']/img").click() driver.implicitly_wait(100) # # driver.find_element_by_class_name(u"btn_qq _login_type_item").click() #错误原因:类名只能单个 # # driver.find_element_by_link_text(u"QQ登录").click() driver.find_element_by_css_selector(u"a[class='btn_qq _login_type_item']").click() # 等待一定时间,让js脚本加载完毕 driver.implicitly_wait(30) print(driver.page_source.encode('utf-8').decode()) # driver.find_element_by_css_selector(u"a[id='switcher_plogin']").click() # a = driver.find_element_by_id("switcher_plogin") # print(a.text) print("123123") # driver.find_element_by_id("switcher_plogin").click() #网页截图 driver.save_screenshot('picture1.png') #打印网页源代码 print(driver.page_source.encode('utf-8').decode())