Python爬虫之selenium高级功能
原文地址
表单操作
元素拖拽
页面切换
弹窗处理
表单操作
表单里面会有文本框、密码框、下拉框、登陆框等。
这些涉及与页面的交互,比如输入、删除、点击等。
前提是找到页面中的元素。
例如下面有一个表单输入框:
"
text
"
name=
"
passwd
"
id=
"
passwd-id
"
/>
获取这个元素的方法:
element = driver.find_element_by_id(
"
passwd-id
"
)
element
= driver.find_element_by_name(
"
passwd
"
)
element
= driver.find_elements_by_tag_name(
"
input
"
)
element
= driver.find_element_by_xpath(
"
//input[@id='passwd-id']
"
)
注意:使用 xpath 的时候还需要注意的是,如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出
NoSuchElementException
的异常。
获取元素之和就要进行输入与点击操作了
输入:
element.send_keys(
"
some text
"
)
点击:
利用 Keys 这个类来模拟点击某个按键,当然首先你要获取按键元素。
element.send_keys(
"
and some
"
, Keys.ARROW_DOWN)
第二种方法:我们获取了按键元素,我们就可以使用click方法点击了
button = broswer.find_element_by_class_name(
'
btn-search
'
)
#
点击按钮
button.click()
删除:
当你元素使用send.keys方法输入字符后,输入的内容不会自动清除,如果我们要输入第二次,就要把第一次的内容删除掉:
element.clear()
上面都是简单的操作,如果我们遇到下拉框应该怎么办呢
WebDriver 中提供了一个叫 Select 的方法,可以帮助我们完成这些事情。
可以根据索引来选择,可以根据值来选择,可以根据文字来选择。
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
最后提交表单:
driver.find_element_by_id(
"
submit
"
).click()
注意:WebDriver 会在表单中寻找它所在的表单,如果发现这个元素并没有被表单所包围,那么程序会抛出
NoSuchElementException
的异常。
元素拖拽
要完成元素的拖拽,首先你需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现。
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()
这样就实现了元素从 source 拖动到 target 的操作。
页面切换
一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
driver.switch_to_window(
"
windowName
"
)
另外你可以使用 window_handles 方法来获取每个窗口的操作对象。例如:
for
handle
in
driver.window_handles:
driver.switch_to_window(handle)
另外切换 frame 的方法如下
driver.switch_to_frame(
"
frameName.0.child
"
)
这样焦点会切换到一个 name 为 child 的 frame 上。
弹窗处理
当你出发了某个事件之后,页面出现了弹窗提示,那么你怎样来处理这个提示或者获取提示信息呢?
alert = driver.switch_to_alert()
通过上述方法可以获取弹窗对象。

