首页 > 技术文章 > Python爬虫之selenium高级功能

-wenli 2019-05-20 23:43 原文

Python爬虫之selenium高级功能

 

原文地址

表单操作

元素拖拽

页面切换

弹窗处理

 

 

表单操作

表单里面会有文本框、密码框、下拉框、登陆框等。

这些涉及与页面的交互,比如输入、删除、点击等。

前提是找到页面中的元素。

例如下面有一个表单输入框:

<input type="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()

通过上述方法可以获取弹窗对象。

 

推荐阅读