本节目标:通过selenium得到搜索答案
selenium的安装详解 本节阅读需要(20)min。 本节实操需要(20)min。
selenium官网
前言selenium的本质是操纵浏览器模拟用户行为!!! 这样才能处理需要交互行为的动态网页. 所以总结起来可以分为几个大点.
- 控制浏览器
- 操作浏览器
- 等待某个变化出现
- 获取元素的值
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
browser=webdriver.Chrome()
try:
browser.get("https://www.baidu.com") # 根url
input=browser.find_element_by_id("kw") # 选择器
input.send_keys("Python") # 选中搜索框后填搜索值
input.send_keys(Keys.ENTER) # 固定常量代表enter键,开始查找
wait=WebDriverWait(browser,10) # 等待产生新的页面对象
wait.until(EC.presence_of_element_located((By.ID,"content_left")))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
time.sleep(10)
finally:
browser.close() # 断开循环
这是一个百度查找的模板。 注意要有提交的操作.单独send_keys(“Python”)只是填入内容,不会发生查找动作.
二、操作浏览器 页面内容及其操作browser.page_source
browser.set_window_size(480, 800)
browser.back()
browser.forward()
browser.refresh() # 刷新
title = browser.title # 打印当前页面title
now_url = browser.current_url # 打印当前页面URL
选择节点
input_first=browser.find_element_by_id("q")
input_second=browser.find_element_by_css_selector("#q")
input_third=browser.find_element(By.ID,"q")
一共有以下的可以选择 find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_xpath() find_element_by_css_selector()
by_id一般用于全局唯一的元素。有的话是首选。
find_element_by_css_selector是更为一般的方式比较推荐。 find_element_by_class_name简单的时候也不错。 find_element_by_xpath如果浏览器可以复制出来并且合适的话也是很推荐的.
CSS的语法之前文章有。
元素的操作from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.taobao.com")
input=browser.find_element_by_id("q")
input.send_keys("iPhone")
time.sleep(10)
input.clear() # 清空填入的元素值
input.send_keys("iPad")
button=browser.find_element_by_class_name("btn-search")
button.click() # 点击搜索
time.sleep(10)
browser.close()
这里点击是靠点击具体的元素。上面的是靠键盘输入enter。大部分情况下两种都是可选的。
鼠标操作鼠标主要做的是选择,拖拽等动作. 在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
ActionChains 类提供了鼠标操作的常用方法:
perform(): 执行所有 ActionChains 中存储的行为; context_click(): 右击; double_click(): 双击; drag_and_drop(): 拖动; move_to_element(): 鼠标悬停。
前提当然都是准确的选中需要的元素.
键盘事件其实就是模拟键盘发送值给浏览器. send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space) send_keys(Keys.TAB) 制表键(Tab) send_keys(Keys.ESCAPE) 回退键(Esc) send_keys(Keys.ENTER) 回车键(Enter) send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A) send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C) send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X) send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V) send_keys(Keys.F1) 键盘 F1
这些键的值都是事先固定的常量值.
动作链这里用到了菜鸟教程的一个jQ的实操动态交互页面。来体验一下拖放!!!
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.common.alert import Alert
browser=webdriver.Chrome()
url="http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
#切换到目标元素所在的frame
browser.switch_to.frame("iframeResult")
#确定拖拽目标的起点
source=browser.find_element_by_id("draggable")
#确定拖拽目标的终点
target=browser.find_element_by_id("droppable")
#形成动作链
actions=ActionChains(browser)
actions.drag_and_drop(source,target)
#执行
actions.perform()
'''
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
'''
t=browser.switch_to_alert()
print(t.text)
t.accept()
time.sleep(10)
browser.close()
三、等待
因为我们处理的是动态的也就是说交互的网页内容. 所以等待这个功能极为重要. 就比如两个人对话,你应该总是听别人讲完,然后再去反应. 分为,显示等待,隐式等待
显示等待显示等待是有目标元素的!!! 也就是等到什么出现或消失执行某个行为
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5, 0.5).until(
EC.presence_of_element_located((By.ID, "kw"))
)
element.send_keys('selenium')
driver.quit()
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) poll_frequency :检测的间隔(步长)时间,默认为0.5S gnored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常 WebDriverWait()一般由until()或until_not()方法配合使用
隐式等待其实就是笼统的等待某个时间长度比如10s,等不到就报错.
driver.implicitly_wait(10)
四、不同的窗口之间移动有的页面可能有不同的窗口。这个要看具体的HTML甚至js代码。 有的时候直观也能看出来。
driver.switch_to_window("windowName")
driver.switch_to_frame("frameName")
总结
一定要通过F12的查看器反复确认鼠标的选择内容是什么, 元素很多的情况在,不能主观猜测.一般都是某个最外层的div作为触发动作的对象.
我们等待的时候怎么判定我们需要等待的是什么元素呢? 在写until之前,一定需要真人反复刷新页面,确认目标元素顺序.
其他的更多高级的部分,虽然高级,但是不常用到。所以以后写一节提一下。