3. 导航
要用WebDriver做的第一件事就是导航到一个链接网址。 执行此操作的常规方法是调用get方法:
driver.get("http://www.google.com")
WebDriver将等待页面完全加载(即onload事件已触发)后,控制权返回脚本。 值得注意的是,如果你加载的页面使用了大量AJAX,那么WebDriver可能不知道它何时加载完全。 如果你需要确保这些页面已完全加载,那么你可以使用waits方法。
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; 我们使用element接口表示所有类型的元素。 这意味着虽然你可能会看到许多可能的方法,当你点击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. 填写表格
下拉列表SELECT的准备知识:
整个是一个SELECT 下拉列表元素,其中每一项是option
我们已经看过如何在textarea或text字段中输入文本,但其他元素呢? 你可以“切换”下拉列表的项 ,你可以使用“setSelected”来设置处理SELECT标签,将OPTION tag 的设置为选择状态。
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_bytag_name("option")
for option in all_options:
print("Value is: %s" % option.get_attribute("value"))
option.click()
这将在页面上找到第一个“SELECT”元素,并依次遍历每个OPTION,打印出它们的值,然后依次选择每个OPTION。
这不是处理SELECT元素的最有效方法。 WebDriver的支持类包括一个名为“Select”的类,它提供了与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。
假设在测试中,我们需要所有默认选定option的列表,Select类提供了一个返回option的属性方法:
select = Select(driver.find_element_by_xpath("//select[@name='name']"))
all_selected_options = select.all_selected_options
获得所有可用options选项:
options = select.options
填写完表单后,你可能想要提交表单。 一种方法是找到“提交”按钮并单击它,如下命令:
# Assume the button has the ID "submit" :
driver.find_element_by_id("submit").click()
或者,WebDriver在每个元素上都有“submit”的方法。WebDriver将遍历DOM模型上的元素,直到找到封闭的表单中的元素,然后调用submit。 如果元素不在表单中,则会引发NoSuchuchElementException 异常
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")
接下来,对驱动程序的所有调用都将被解释为定向到特定窗口。 但你怎么知道窗口的名字? 看一下打开它的javascript或链接URL:
<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 *。
一旦我们完成iFrame的处理,我们将不得不回到父IFrame,可以使用以下方法完成:
driver.switch_to_default_content()
3.5. 弹出对话框
Selenium WebDriver内置支持处理弹出对话框。 在触发打开弹出窗口的操作后,你可以使用以下命令访问弹出对话框:
alert = driver.switch_to_alert()
这将返回当前打开的弹出对话框对象。 使用此对象,你现在可以接受,关闭,读取其内容,甚至可以键入提示。 此switch_to_alert方法在弹alerts窗,confirms确认弹窗和prompts提示等对话弹窗中同样有效。 有关更多信息,请参阅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 t你he 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
---------------------------------------------------------------------
请关注pyhelloworld, 获取更多精彩内容