Fork me on GitHub

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 下载的网址在这

这个插件能让你记录你使用浏览器的操作. 

 

安装好火狐上的这个插件后, 打开它.

 

找到插件上的 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

 

Selenium 获取文本信息方法+select(定位)

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())

 

posted @ 2018-11-28 20:25  RongT  阅读(258)  评论(0编辑  收藏  举报