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()
通过上述方法可以获取弹窗对象。