python selenium使用方法笔记(上) - ZhouXuyan/notes GitHub Wiki
一 安装
默认已有python环境和chrome浏览器
1、pip install selenium
2、下载与chrome版本相对应的webdriver
3、新建一个chromedriver文件夹,把下载的driver放入
4、将路径放入PATH
二 起飞
一、简单小例子
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#Keys类提供键盘操作,如RETURN, F1, ALT
driver=webdriver.Chrome()
#创建谷歌浏览器的实例
driver.get("http://www.python.org")
#driver.get方法指向指定页面,webdriver在进行下一步操作之前,会等到这个页面全部加载完成(onload事件发生)
elem = driver.find_element_by_name("q")
#定位。
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
#清楚默认文本,输入,回车
assert "No results found." not in driver.page_source
#提交之可能会得到result,为了确保收到了result,做出如上声明
driver.close()
#退出。也可以用quit方法。quit方法将推出整个浏览器而不是一个tab。当然只有一个tab时,关闭该tab也就使浏览器关闭了。
二、selenium做测试
Selenium多用于做测试。但是Selenium本身不提供测试工具,我们用python的unitest模块。(第三方模块pytest也很棒) class PythonOrgSearch(unittest.TestCase): 测试用例继承自unittest.TestCase
def setUp(self):
初始化的方法,在所有你将会在测试用例中实现的方法之前调用 在这里我们初始化一个webdriver的实例
def test_search_in_python_org(self):
这是一个测试用例方法。这个测试用例方法的命名应用‘test_’开头
def tearDown(self):
在所有方法调用完毕后调用该方法,用于做一些清理操作。
例子:
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_search_in_python_org(self):
driver = self.driver
driver.get("http://www.python.org")
self.assertIn("Python", driver.title)
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
三 导航
最简单的导航方法就是get方法了,这个方法一直会等到页面全部加载完成。但如果一个页面使用了AJAX技术,webdriver就可能搞不清什么时候才算是加载完成。这个时候我们可以使用wait。
一、与页面交互
WebDriver提供许多种寻找元素的方法,例如,给定如下html代码
<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 错误。
现在我们获得了一个元素。 首先,我们可以向文本框中输入一些文字:
element.send_keys("some text")
也可以通过使用Keys类模拟点击鼠标:
element.send_keys(" and some", Keys.ARROW_DOWN)
element.click()
任何元素都可以调用send_keys 方法,但是输入的文字不会自动清除,这时我们调用下面的方法:
element.clear()
二、填写表单
如果我们想操作多个元素,我们可以用切换状态的方法解决:
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()
以上代码找到第一个选中的元素,循环遍历其中的每一个OPTION,并打印他的值。
但是很明显,这不是最有效的方法。
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(driver.find_element_by_xpath("//select[@name='name']"))
all_selected_options = select.all_selected_options
如果要得到所有可选的选项:
options = select.options
一旦填完了所有表单,就可以提交了。一种提交的方法是点击submit按钮:
driver.find_element_by_id("submit").click()
三、拖拽
from selenium.webdriver import ActionChains
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
四、窗口间切换
现代web应用都有很多窗口页面,根据窗口的名字,WebDriver的switch_to_window方法支持窗口键移动:
driver.switch_to_window("windowName")
如何获得窗口的名称?查看javascript代码或者打开窗口的链接。 也可以通过“window handle”使用“switch_to_window()” 方法:
for handle in driver.window_handles:
driver.switch_to_window(handle)
也可以在框架间切换:
driver.switch_to_frame("frameName")
用点分割路径,可以到达子框架:
driver.switch_to_frame("frameName.0.child")
这样就到达了frameName框架下第一个子框架中名为child的框架。
一旦在当前框架下工作完成了,返回父框架:
driver.switch_to_default_content()
五、弹出框
在你的某个操作之后,可能会弹出一个对话框。用以下方法到达对话框:
alert = driver.switch_to_alert()
六、导航:历史和定位
去到指定的页面使用get方法:
driver.get("http://www.example.com")
向后或向前:
driver.forward()
driver.back()
七、缓存
如何使用缓存:
driver.get("http://www.example.com")
# 设置缓存,对整个域名都有效
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# 输出所有当前url的缓存
driver.get_cookies()