一 导航

使用WebDriver第一件想做的事情就是导航到指定链接。通常可以调用get方法去实现:

driver.get("http://www.google.com")

driver.get方法会导航到url指定的页面。webdriver会等待页面完全加载后,把控制权还给test脚本。需要注意的是,如果页面中使用了大量的AJAX负载过大,webdriver可能不知道什么时间加载完成。如果你想确保页面加载完全可以使用wait.

1.页面交互

只是导航到指定链接并不是很有用。我们想做的页面上的交互,准确的说是页面的元素操作。首先,我们要先找到它。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']")

还可以通过文本去找到链接,但要小心。该文本必须完全匹配。同样需要小心使用XPATH. 如果有多个元素匹配,只有第一个会返回。如果都没有找到,则会触发NoSuchElementException异常。

WebDriver有一个”Object-based"API;所有类型的元素使用相同的接口。这意味着,虽然使用IDE自动补全功能会看到大量可用的方法,但是并不是所有的都可用或有效。不必担心,Webdriver 会尽量去做正确的事情,如果调用了一个没有意义的方法,会触发异常。

获取了元素之后,就可以输入文本:

element.send_keys("some text")

还可以通过“Key"类模拟使用方向键:

element.send_keys(" and some", Keys.ARROW_DOWN)

send_keys可以将键盘快捷键应用到任何元素中,例如Gmail.但有一个副作用是输入的文本区的内容不能自动清除。相反,输入的内容会追加到输入区。可以clear方法容易的清除这些内容:

element.clear()

2.填写表单

前面已经说了如何在输入区输入文本,但其他元素呢?可以使用"toggle"下拉状态,使用“setSelected"进行选择框的设置。

element = driver.find_element_by_xpath("//select[@name='name']"
all_options = element.find_element_by_tag_name("option")
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    option.click()

它会找到第一个”SELECT"元素,并且循环打印每个选项的值,并且选中。 这不是处理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中选项。

假设在一次测试中,我们需要所有默认选项的列表。Select类提供的方法可以返回一个列表。

select = Select(driver.find_element_by_xpath("xpath")
all_selected_options = select.all_selected_options

获取所有可用的选项:

options = select.options

当完成表格填写后,需要提交。一种方式就是找到"submit”键进行点击:

#Assume the button has the ID "submit":)
driver.find_element_by_id("submit").click()

另外,WebDriver有适用每个元素"submit"的简单方法。如果你在form中调用submit方法,webdriver会遍历DOM并调用submit,直到找到form的结束。如果元素不是一个form,就会触发NoSuchElementException异常:

element.submit()

3.拖放

可用使用drag和drop,或移动元素,或移动到另一个元素:

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()

4.窗口和框架之间移动

现在的web应用很少只有一个窗口或没有框架的。WebDriver支持使用"switch_to_window"方法移动不同名称的窗口:

driver.switch_to_window("windowName")

现在应用到driver的调用,全部解析到指定名称的窗口。但是如何获取窗口的名称呢?看下打开的javascript或链接:

<a href="somewhere.html" target="windowName">Click here to open a window</a>

或则,可以通过窗口句柄去使用“switch_to_window"方法。了解了这个,就可以像这样打开每一个遍历的窗口:

for handle in driver.window_handles:
    driver.switch_to_window(handle)

还可以进行frame到frame的摆动(或在frame中):

driver.switch_to_frame("frameName")

可以通过.路径访问子框架,或通过它的索引指定框架:

driver.switch_to_frame("frameName.0.child")

这样就会到达名字为frameName框架的第一个子框架的名为"child"的框架。如果使用from top,所有框架都会被evaluated.

当我们操作框架时,有时我们需要从子框架返回到它的父框架:

driver.switch_to_default_content()

5.弹出对话框

Selenium WebDriver内置了对弹出对话框的支持。当触发动作弹出一个对话框后,可以通过 alert访问:

alert = driver.switch_to_alert()

这会返回当前打开的alert对象。获取对象后,可以接受、忽略、读取内容或输入标志等操作。该接口同样适用于警报、确认、提示等对话框。可以参阅相关API了解更多内容。

6.导航:历史记录和位置

前面,我们通过"get"命令导航到指定网页(driver.get("http://www.example.com").WebDriver有一些小的,任务聚焦的接口,并且导航也是有用的task,导航到具体网页,可以通过:

driver.get("http://www.example.com")

前后移动浏览器记录:

driver.forward()
driver.back()

注意,这些功能依赖于底层驱动。当你调用这些方法的时候,不同的浏览器可能会有不同行为。

7.Cookies

当离开这些后续步骤后,可能感兴趣的是了解如何使用cookies.首先,我们要确定当前域名的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 avilable cookies for the current URL
driver.get_cookies()

Top^

上一篇Selenium主题2 下一篇Selenium主题4

by 李鹏