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