Python加Selenium自动化测试知乎网站(六)特殊操作
除了常规操作类似点击、滑动、勾选等,偶尔会遇到需要特殊操作的时候,比如鼠标mouseover、双击、右击、拖拽、长按、移动,在某些表单的填写时就会有这类型的需求,拖动选择日期控件输入控件什么的。有时还需要模拟键盘按键。还好,selenium也支持这类型操作。
我们在utils下新增一个文件,试试其中几种操作:
from selenium.webdriver.common.action_chains import ActionChains
class SpecialAction:
def __init__(self, driver):
self.action_chains = ActionChains(driver)
def mouse_over(self, element):
self.action_chains.move_to_element(element).perform()
def double_click(self, element):
self.action_chains.double_click(element).perform()
def right_click(self, element):
self.action_chains.context_click(element).perform()
def drag_and_drop(self, element, to):
self.action_chains.drag_and_drop(element, to).perform()
要注意的是,需要加上perform。
现在在脚本里试试mouse over和右键:
from selenium import webdriver
from utils.special_action import SpecialAction
topic_url = "https://www.zhihu.com/topic/19552832/hot"
driver = webdriver.Chrome()
driver.get(topic_url)
action = SpecialAction(driver)
focus_topic_button = driver.find_element_by_xpath("//div[@class='TopicActions TopicMetaCard-actions']/button[contains(@class, 'TopicActions-followButton')]")
action.mouse_over(focus_topic_button)
action.right_click(focus_topic_button)
driver.close()
driver.quit()
运行后能够看到鼠标移动在关注按钮上,出现右键菜单。
接着我们试着发送键盘按键,单个按键,组合按键。
selenium中有一个叫Keys的类,这里定义的就是各类按键的ASCII码:
class Keys(object):
"""
Set of special keys codes.
"""
NULL = '\ue000'
CANCEL = '\ue001' # ^break
HELP = '\ue002'
BACKSPACE = '\ue003'
BACK_SPACE = BACKSPACE
TAB = '\ue004'
CLEAR = '\ue005'
RETURN = '\ue006'
ENTER = '\ue007'
SHIFT = '\ue008'
......
我们可以用send_keys来发送这些按键信息,比如我们输入关键词发送回车键,Ctrl加a全选页面内容。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
topic_url = "https://www.zhihu.com/topic/19552832/hot"
driver = webdriver.Chrome()
driver.get(topic_url)
search_field = driver.find_element_by_xpath("//div[contains(@class, 'AppHeader-SearchBar')]//input")
search_field.send_keys("selenium")
search_field.send_keys(Keys.ENTER) # 单个回车按键,不用点击搜索按钮
whole_page = driver.find_element_by_xpath("//html//body")
whole_page.send_keys(Keys.COMMAND, 'a') # 组合Command+A按键
driver.close()
driver.quit()
另外ActionChains其实也能做到组合按键,只是略显麻烦:
# 代表着command键按下,同时按了字母a,再松开command键
ActionChains(driver).key_down(Keys.COMMAND).send_keys('a').key_up(Keys.COMMAND).perform()
此外,我们也会经常用到iframe、alert和浏览器窗口的操作。(知乎没有找到iframe,alert,这里就简单介绍一下用法)
对于iframe,我们需要切换进去,才能获得其中元素并操作。
iframe = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to.frame(iframe)
对于alert,我们可以获取文本、点确定,点取消。
alert = driver.switch_to.alert
print(alert.text) # 弹窗内容
alert.accept() # 确认
alert.dimiss() # 取消
对于窗口,有些链接点击后会新增一个window,也可以切换过去
all_windows = driver.window_handles # 获得所有窗口
driver.switch_to.window(all_windows[-1]) # 切换到最近打开的窗口