Loading

Selenium

date: 2018-12-14 08:47:49
updated: 2018-12-14 13:14:22

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()
# 添加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")
posted @ 2020-10-21 16:43  猫熊小才天  阅读(111)  评论(0编辑  收藏  举报