elem = driver.find_element_by_name("q")
接着我们发送了一些字符,类似于用键盘直接输入。特殊的键盘符我们可以导入
selenium.webdriver.common.keys,然后用 Keys 类来表示:
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
提交页面之后我们应该确认一下是否有返回,为了确定有东西返回,我们在这里下一个断言:
assert "No results found." not in driver.page_source
最后浏览器窗口被关闭了,你也可以调用 quit 方法来代替 close,区别在于 quit 会退出整个浏览器,
而 close 只会关闭一个标签,但是如果浏览器只有一个标签,那么这两个方法完全一样,都会关闭整
个浏览器。
driver.close()
Final lines are some boiler plate code to run the test suite:
if __name__ == "__main__":
unittest.main()
使用 Selenium 的 remote WebDriver
要使用 remote WebDriver,你先要运行 Selenium server,用下面这个命令:
java -jar selenium-server-standalone-2.x.x.jar
运行 Selenium server 时,你可以看到类似这样一条信息:
15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
意思是说你可以用这个 URL 连接到 remote WebDriver,下面是一些例子:
from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.OPERA)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)
desired_capabilities 是一个 dict,如果你不使用默认的 dict,你可以自己指定值:
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'browserName': 'htmlunit',
'version': '2',
'javascriptEnabled': True})
3.导航
你用 WebDriver 要做的第一件事就是指定一个链接,一般我们使用 get 方法:
driver.get("http://www.google.com")
WebDriver 会等待页面完全加载完(就是 onload 函数被触发了),才把程序的控制权交给你的测试或者脚
本。 但是如果你的页面用了太多的 AJAX,那么这个机制就没什么卵用了,因为它不知道页面到底
是什么时候加载完。如果你需要确定页面完全加载完了,你可以使用 waits
页面交互
我们比较喜欢做的事情就是和页面交互,准确的说,是和页面里的 HTML 元素交互。首先,我们要
找到一个元素,WebDrive 提供了许多方法查找元素,例如,给定一个这样的元素:
你可以用下列任意方法找到它:
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 有一个 基于对象的 API,我们可以通过同一个接口代表所有类型的元素,这意味着当你
敲击你 IDE 的自动补全组合键的时候,虽然你会看到你可以调用很多方法,但不是所有的方法都行得
通。不过不要担心!WebDriver 会自己尝试做正确的选择。并且如果你调用一个没用的方法(例如在
一个 meta 标签上调用 setSelected()),WebDriver 会抛出一个异常
那么,当你获取到一个元素之后,你可以做些什么呢?首先,你可能会想输入一些文本到一个文本区
域:
element.send_keys("some text")
你可以使用 Keys 类来模拟输入方向键:
element.send_keys(" and some", Keys.ARROW_DOWN)
理论上任意的元素都可以调用 send_keys 方法,就是说我们可以测试例如 Gmail 的键盘快捷键。send_keys
的副作用就是输入文本到文本域不会自动清除,而是会附加到原有的文本后面,我们可以使用 clear
方法来很方便的清除文本框或者文本域的内容:
element.clear()
填充表单
我们已经知道怎么向一个文本框和文本域输入内容,但是其他元素我们要怎么处理? 你可以触发下
拉选框,并且用 setSelected 方法来让一个选项被选中,处理选择框不会很困难:
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()
这段代码会找到页面的第一个选择框元素,然后遍历每个选项,输出他们的值,并且依次选中。
你可以看到,这种方式处理选择框不太高效,WebDriver 支持许多类,其中包括一个 Select 的类,给
我们提供了许多有用的方法:
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.selct_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(driver.find_element_by_xpath("xpath"))
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 对每个元素都提供一个 submit 方法,如果在一个表单内的元素上调用,WebDriver 会沿着
DOM 树往上一直寻找,直到找到一个闭合的表单为止,然后调用 submit 方法;如果元素不在表单内,
那么会抛出一个 NoSuchElementException 异常。
拖放
你可以使用拖放功能,移动确定数量的元素,或者拖到另一个元素上面:
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()
可以看这个页面的演示
在窗口(window)和框架(frame)间移动
现在的网页应用里没有页面框架或者只用一个窗口就包含了所有内容的已经很少了。WebDriver 支
持在指定的窗口间移动,方法为 switch_to_window:
driver.switch_to_window("windowName")
现在所有的 driver 的调用都会指向这个给定的窗口,但是我们怎么知道窗口的名字是什么呢?可以看
一看打开这个窗口的 javascript 脚本或者 link 链接:
Click here to open a new window
或者,你可以传一个 window handle 给 switch_to_window()方法,它就可以像这样迭代每一个打开的窗口:
for handle in driver.window_handles:
driver.switch_to_window(handle)
你也可以在框架和框架之间切换 (or into iframes):
driver.switch_to_frame("frameName")
我们可以用.分离路径来访问子框架,并且可以指定它的索引:
driver.switch_to_frame("frameName.0.child")
这会跳到'frameName'框架内第一个名为'child'的子框架。All frames are evaluated as if from top.
一旦我们操作完了框架,我们可以通过下面的操作回到父框架:
driver.switch_to_default_content()
弹出对话框
Selenium 内置支持处理弹出对话框,当你触发了弹框操作,你可以用下面的方法获得对话框元素:
alert = driver.switch_to_alert()
上述代码返回当前打开的对话框对象,有了这个对象 我们可以做确定、忽略、阅读提示文本或者甚
至输入 prompt,这个接口可以很好的操作 alerts、confirms、prompts 等对话框。更多内容参阅 API
文档