Selenium
1.配置环境
1.1 安装selenium
pip install selenium
1.2 安装webdriver
安装Chrome的webdriver插件
https://sites.google.com/a/chromium.org/chromedriver/downloads
下载完成之后将 .exe 文件放入到Chrome的安装目录,默认安装路径是C:\Program Files (x86)\Google\Chrome
,所以复制到C:\Program Files (x86)\Google\Chrome\Application
下。
1.3 测试
def open_page():
browser = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
browser.get('http://www.baidu.com/')
2.Demo:QQMail
def open_QQmail():
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
driver.get('https://mail.qq.com/') # 打开QQ邮箱首页
time.sleep(3) # 等待页面载入
# 切换iframe
# selenium只能在一个页面中寻找元素,对于iframe嵌入的页面需要跳转到对应的iframe才能继续操作
login_frame = driver.find_element_by_name("login_frame")
driver.switch_to_frame(login_frame)
# 如果已经登录了QQ,那么就需要加上下面这行代码,用于切换到账号密码登录
driver.find_element_by_id("switcher_plogin").click()
driver.find_element_by_name("u").clear() # 先清空对应文本框的内容
driver.find_element_by_name("u").send_keys("QQ号") # 输入文本
driver.find_element_by_name("p").clear()
driver.find_element_by_name("p").send_keys("QQ密码")
driver.find_element_by_id("login_button").click() # 点击登录按钮
time.sleep(15) # 等待是为了观察页面是否正确跳转
print(driver.current_url) # 打印跳转后的页面url,如果等待时间过短,此时驱动可能还没有完全跳转,打印出来的 current_url 还是 'https://mail.qq.com/'
driver.close() # 关闭一个标签页,对于 Chrome 来说,关闭唯一一个标签页浏览器也会关闭,但是 Firefox 和 Opera 不会关闭浏览器
# driver.quit() # 关闭Chrome浏览器
3.页面交互
3.1 提交表单
driver.find_element_by_id("id").submit()
3.2 下拉列表
# 先获取 select 下拉框,然后遍历其中的 option
# 效率较低
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
print("Value is: %s" % option.get_attribute("value"))
option.click()
# 获取 select 下拉框,通过 option 的下标、文本、值来进行选择
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
# 取消选择
select = Select(driver.find_element_by_id('id'))
select.deselect_all()
# 获取所有已选的选项
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options
# 获取所有可选的选项
options = select.options
3.3 元素拖拽
# 先指定被拖动的元素(Source)和拖动目标元素(Target)
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
3.4 页面切换
# 切换窗口
driver.switch_to_window("windowName")
# 获取每个窗口的操作对象
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 切换iframe
driver.switch_to_frame("iframeName")
# 通过“.”操作符你还可以获得子frame,并通过下标指定任意frame
driver.switch_to_frame("frameName.0.child")
# 返回父frame
driver.switch_to_default_content()
3.5 弹窗处理
# 获取页面出现了弹窗提示
alert = driver.switch_to_alert()
3.6 历史记录
driver.forward()
driver.back()
3.7 cookie
# 添加cookie
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# 获取cookie
driver.get_cookies()
4.元素获取
4.1 单个元素获取
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
4.2 多个元素获取
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
5.页面等待
现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。这会让元素定位困难而且会提高产生 ElementNotVisibleException 的概率。
所以 Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。隐式等待是等待特定的时间,显式等待是指定某一条件直到条件完成时才继续执行。
5.1 显式等待
显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。
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.Chrome()
driver.get("http://www.")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "id"))
)
finally:
driver.quit()
程序默认会 500ms 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。
下面是一些内置的等待条件,你可以直接调用这些条件,而不用自己写某些等待条件了。
title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable – it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present
5.2 隐式等待
# 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("id")