你想要用WebDriver做的第一件事就是导航到一个链接。通常的方法是调用get方法:
driver.get("http://www.google.com")
onload在将控件返回到测试或脚本之前,WebDriver将等待页面完全加载(即 事件已触发)。值得注意的是,如果您的页面在加载时使用了大量AJAX,那么WebDriver可能不知道它何时完全加载。如果您需要确保这些页面已完全加载,那么您可以使用 等待。
3.1。与页面交互
能够去地方并不是非常有用。我们真正想做的是与页面进行交互,或者更具体地说,是与页面中的HTML元素进行交互。首先,我们需要找到一个。WebDriver提供了许多查找元素的方法。例如,给定一个定义为的元素:
<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_element_by_xpath("//input[@id='passwd-id']")
您也可以通过文本查找链接,但要小心!文字必须完全匹配!在WebDriver中使用XPATH时也应该小心。如果有多个元素与查询匹配,则只返回第一个元素。如果找不到任何东西,NoSuchElementException将会提出。
WebDriver有一个“基于对象”的API; 我们使用相同的接口表示所有类型的元素。这意味着虽然您可能会看到许多可能的方法,当您点击IDE的自动完成组合键时可以调用它们,但并非所有方法都有意义或有效。别担心!WebDriver将尝试做正确的事情,如果你调用一个没有意义的方法(例如,“meta”标签上的“setSelected()”)将引发异常。
所以,你有一个元素。你能用它做什么?首先,您可能希望在文本字段中输入一些文本:
element.send_keys("some text")
您可以使用“Keys”类模拟按箭头键:
element.send_keys(" and some", Keys.ARROW_DOWN)
可以在任何元素上调用send_keys,这样就可以测试键盘快捷键,例如GMail上使用的键盘快捷键。这样做的副作用是在文本字段中键入内容不会自动清除它。相反,您键入的内容将附加到已存在的内容中。您可以使用clear方法轻松清除文本字段或textarea的内容:
element.clear()
3.2。填写表格
我们已经看过如何在textarea或text字段中输入文本,但其他元素呢?您可以“切换”下拉列表的状态,并且可以使用“setSelected”来设置选择的 OPTION标记。处理SELECT标签也不错:
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
print("Value is: %s" % option.get_attribute("value"))
option.click()
这将在页面上找到第一个“SELECT”元素,并依次遍历每个OPTION,打印出它们的值,然后依次选择每个OPTION。
如您所见,这不是处理SELECT元素的最有效方法。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)
WebDriver还提供了取消选择所有选定选项的功能:
select = Select(driver.find_element_by_id('id'))
select.deselect_all()
这将从页面上的特定SELECT中取消选择所有OPTION。
假设在测试中,我们需要所有默认选定选项的列表,Select类提供了一个返回列表的属性方法:
select = Select(driver.find_element_by_xpath("//select[@name='name']"))
all_selected_options = select.all_selected_options
要获得所有可用选项:
options = select.options
填写完表单后,您可能想要提交表单。一种方法是找到“提交”按钮并单击它:
# Assume the button has the ID "submit" :)
driver.find_element_by_id("submit").click()
或者,WebDriver在每个元素上都有“提交”的便捷方法。如果在表单中的元素上调用它,WebDriver将向上走DOM,直到找到封闭的表单,然后调用submit。如果元素不在表单中, NoSuchElementException则会引发:
element.submit()
3.3。拖放
您可以使用拖放,将元素移动一定量,或者移动到另一个元素:
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()
3.4。在窗口和框架之间移动
现代Web应用程序很少没有任何框架或被限制在单个窗口中。WebDriver支持使用“switch_to_window”方法在命名窗口之间移动:
driver.switch_to_window("windowName")
所有调用driver现在将被解释为定向到特定窗口。但你怎么知道窗口的名字?看一下打开它的javascript或链接:
<a href="somewhere.html" target="windowName">Click here to open a new window</a>
或者,您可以将“窗口句柄”传递给“switch_to_window()”方法。知道这一点,就可以迭代每个打开的窗口,如下所示:
for handle in driver.window_handles:
driver.switch_to_window(handle)
你也可以逐帧摆动(或转入iframe):
driver.switch_to_frame("frameName")
可以通过用点分隔路径来访问子帧,也可以通过索引指定帧。那是:
driver.switch_to_frame("frameName.0.child")
将转到称为“frameName”的帧的第一个子帧的名为“child”的帧。 所有帧都被评估为来自* top *。
一旦我们完成框架的处理,我们将不得不回到父框架,可以使用以下方法完成:
driver.switch_to_default_content()
3.5。弹出对话框
Selenium WebDriver内置支持处理弹出对话框。在您触发将打开弹出窗口的操作后,您可以使用以下命令访问警报:
alert = driver.switch_to_alert()
这将返回当前打开的警报对象。使用此对象,您现在可以接受,关闭,读取其内容,甚至可以键入提示。此界面在警报,确认和提示方面同样有效。有关更多信息,请参阅API文档。
3.6。导航:历史和位置
之前,我们介绍了使用“get”命令导航到页面( driver.get(“http://www.example.com”))正如您所见,WebDriver有许多较小的,以任务为中心的界面,导航是一项有用的任务。要导航到页面,您可以使用get方法:
driver.get("http://www.example.com")
要在浏览器的历史记录中前后移动:
driver.forward()
driver.back()
请注意,此功能完全取决于底层驱动程序。如果您习惯于一个浏览器的行为而不是另一个浏览器,那么当您调用这些方法时,可能会发生意外情况。
3.7。Cookies
在我们离开这些后续步骤之前,您可能有兴趣了解如何使用cookie。首先,您需要在cookie的有效域上:
# Go to the correct domain
driver.get("http://www.example.com")
# Now set the cookie. This one's valid for the entire domain
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# And now output all the available cookies for the current URL
driver.get_cookies()