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