0基础也能教会你如何搭建Python+Selenium环境以及元素定位

前言

不用我说现在很多人出去面试,基本上面试官都会问你会不会自动化这个问题,显而易见自动化测试已经成为一种趋势,今后较好的测试岗位一定会竞争的更加激烈,既然岗位如此的内卷,那我们还不得赶紧学起来。

今天主要给大家讲讲如何搭建Python+Selenium环境以及八大元素定位法,话不多说我们直接进入主题。

一、Selenium 的环境搭建

  • 在 Windows 搭建和部署 Selenium 工具
  • 主要包括两个步骤:
    • 安装 Python 语言
    • Python的官方网站:http://www.python.org
    • Python 目前并行了两套版本,2.x 和 3.x。如果你之前没有 Python 的使用经验,建议使用 Python 3.x 版本。两套版本互相不兼容,并且 Python 从 3.5(含)开始,不再支持 Windows XP 系统,请注意。
      • 选择安装目录
        • 3.4或者3.4以下的版本,都是 C:\python34
        • 3.5以上的目录,默认装个人文件夹,建议用类似上面的目录,比如C:\python35
      • 勾选添加环境变量
      • 勾选Add Python.exe to PATH
      • 安装过程中不要关闭弹出来的命令行窗口
      • 关于 Python 的安装,也可以选择一些第三方的Python 安装包,典型的有 Anaconda3,这样的包有丰富的第三方库,在使用 Python 的过程中会更加方便。
      • Anaconda 的官网:https://www.continuum.io/anaconda-overview
    • 安装 Selenium 工具包
    • 由于 安装好的 Python 默认有 pip Python 包管理工具,可以通过 pip 非常方便的安装 Selenium。
      • 启动命令行工具:Win+R | 输入 cmd | 回车
      • 输入命令:
      • pip install selenium
      • 该命令的执行需要有互联网联网环境。此外该命令有以下几种选项可以使用
        • 安装指定的版本,例如安装指定的 Selenium 3.4.3
        • pip install selenium==3.4.3
        • 安装最新版的 Selenium
        • pip install -U selenium # -U 也可以用 --upgrade pip install --upgrade selenium
        • 卸载安装当前的 Selenium
        • pip uninstall selenium
      • 当然,如果您的机器处于非接入互联网的环境,您可以事先下载 Selenium 的 Python 安装包,再进行手动安装。
        • 官方下载地址:https://pypi.python.org/pypi/selenium
        • 上述地址会下载最新版的 Selenium,目前最先版的是 3.4.3,您也可以根据以下路径下载指定的 3.4.3
        • Selenium 3.4.3 下载地址:https://pypi.python.org/pypi/selenium/3.4.3#downloads
        • 下载后,解压该压缩包
        • 然后用命令行进入该压缩包的根目录,输入命令进行安装
        • python setup.py install
  • 配置 浏览器 和 驱动
    • Selenium 2 可以默认支持Firefox 46.0或者更低版本,对于其他浏览器需要额外安装驱动。
    • Selenium 3 对于所有的浏览器都需要安装驱动,本文以 Chrome 和 Firefox、IE为例设置浏览器和驱动。
      • ChromeDriver下载地址:http://chromedriver.storage.googleapis.com/index.html
      • ChromeDriver 与 Chrome 对应关系表:
      • ChromeDriver版本 支持的Chrome版本 v2.31 v58-60 v2.30 v58-60 v2.29 v56-58 v2.28 v55-57 v2.27 v54-56 v2.26 v53-55 v2.25 v53-55 v2.24 v52-54 v2.23 v51-53 v2.22 v49-52 v2.21 v46-50 v2.20 v43-48
      • GeckoDriver下载地址:https://github.com/mozilla/geckodriver/releases
      • GeckoDriver 与 Firefox 的对应关系表:
      • GeckoDriver版本 支持的Firefox版本 v0.18.0 v56 v0.17.0 v55 v0.16.0 v54,需要Selenium 3.4或者以上 v0.15.0 v53,需要Selenium 3.3或者以上
      • IEDriverServer下载地址:http://selenium-release.storage.googleapis.com/index.html
      • IEDriverServer 的版本需要与 Selenium 保持严格一致。
    • 浏览器驱动的配置
      • 首先,将下载好的对应版本的浏览器安装。
      • 其次,在 Python 的根目录中,放入浏览器驱动。
      • 最好再重启电脑,一般情况下不重启也可以的。

二、 Selenium 的最简脚本

通过上一节的环境安装成功以后,我们可以进行第一个对Selenium 的使用,就是最简脚本编写。脚本如下:

# 声明一个司机,司机是个Chrome类的对象
driver = webdriver.Chrome()

# 让司机加载一个网页
driver.get("http://demo.ranzhi.org")

# 给司机3秒钟去打开
sleep(3)

# 开始登录
# 1. 让司机找用户名的输入框
we_account = driver.find_element_by_css_selector('#account')
we_account.clear()
we_account.send_keys("demo")

# 2. 让司机找密码的输入框
we_password = driver.find_element_by_css_selector('#password')
we_password.clear()
we_password.send_keys("demo")

# 3. 让司机找 登录按钮 并 单击
driver.find_element_by_css_selector('#submit').click()
sleep(3)

实际上一段20行的代码,也不能算太少了。但是这段代码的使用,确实体现了 Selenium 的最简单的使用。我们在下面内容进行阐述。

  • 关于面向对象编程
  • 通过前面的介绍,我们知道 Selenium 支持多种语言,并且推荐使用面向对象的方式进行编程。接下来我们将着重介绍如何使用面向对象的方式进行编程。
  • 我们利用 Python 进行面向对象编程,需要首先了解一个概念:类
    • 类是任何面向对象编程的语言的基本组成,描述了使用的基本方法。我们可能在目前,还不是特别明白类的含义,但是我们可以通过类的使用,来进一步了解。
    • 类的使用
    • 类,通过实例化进行使用。比如有一个类: Driver,该类有一个方法: head(road)
    • 那么关于这个类的使用,只需要两个步骤:
    • 实例化该类:d = Driver()
    • 调用类的方法:d.head("中山路")
    • 了解上述例子和使用以后,我们来看具体的 Selenium 的使用。
  • 具体的对象的使用
  • 在面向对象的理念看来,任何的编码,都是由对象而来的,这里也不例外。和之前介绍 WebDriver 时候的描述对应,我们需要用到两种主要的类,并将其实例化。
    • WebDriver 类:主要靠直接实例化该类为对象,然后用其对象直接调用该类的方法和属性
    • WebElement 类:主要通过 WebDriver 类实例化的对象,通过对页面元素的查找,得到 WebElement 类的对象,然后调用该类的方法和属性。

  • 上述代码中,使用了一个 WebDriver 类 的对象,即第2行,声明了该类的对象,并赋值给变量 driver,接着变量 driver 作为 WebDriver 类的对象,使用了多个 WebDriver 类的方法。
  • 注意:Chrome 是 WebDriver 的子类,是 WebDriver 类的一种
    • get(url): 第5行,打开网址
    • find_element_by_css_selector(selector): 第12、17、22行都使用了该方法,同时通过对该方法的调用,分别各产生了一个 WebElement类的对象,we_account,we_password和最后一个匿名的对象,并通过产生的三个对象,调用 WebElement 类的方法 clear():清理页面元素中的文字 send_keys(text):给页面元素中,输入新的文字 click():鼠标左键点击页面元素
  • 正是通过这样的面向对象的方式,产生 Web司机(WebDriver类的对象),并且通过 Web司机不懈的努力,寻找到各种 Web元素(WebElement类的对象)进行操作,这样便实现了 Selenium WebDriver 作为一款出色的浏览器测试工具,进行浏览器UI界面的自动化测试的代码编写和用例执行。

三、Selenium WebDriver API 的使用

通过上述最简脚本的使用,我们可以来进一步了解 Selenium 的使用。事实上,上一节用的,便是 Selenium 的 WebDriver API。API(Application Programming Interface,应用程序编程接口,即通过编程语言,操作 WebDriver 的方法集合)

Selenium WebDriver API 官方参考:http://seleniumhq.github.io/selenium/docs/api/py/

具体API文档地址:https://seleniumhq.github.io/selenium/docs/api/py/api.html

  • API 使用: 用现成的类(大部分情况)的方法进行编程 WebDriver WebElement
  • API 文档 编程使用说明 介绍了每个方法的使用 方法的作用 方法的参数 方法的返回值

四、 控制浏览器

浏览器的控制也是自动化测试的一个基本组成部分,我们可以将浏览器最大化,设置浏览器的高度和宽度以及对浏览器进行导航操作等。

# 浏览器打开网址
driver.get("https://www.baidu.com")

# 浏览器最大化
driver.maximize_window()

# 设置浏览器的高度为800像素,宽度为480像素
driver.set_window_size(480, 800)

# 浏览器后退
driver.back()

# 浏览器前进
driver.forward()

# 浏览器关闭
driver.close()

# 浏览器退出
driver.quit()

五、 元素定位操作

WebDriver提供了一系列的定位符以便使用元素定位方法。常见的定位符有以下几种:

  • id
  • name
  • class name
  • tag
  • link text
  • partial link text
  • xpath
  • css selector

那么我们以下的操作将会基于上述的定位符进行定位操作。

对于元素的定位,WebDriver API可以通过定位简单的元素和一组元素来操作。在这里,我们需要告诉Selenium如何去找元素,以至于他可以充分的模拟用户行为,或者通过查看元素的属性和状态,以便我们执行一系列的检查。

在Selenium2中,WebDriver提供了多种多样的find_element_by方法在一个网页里面查找元素。这些方法通过提供过滤标准来定位元素。当然WebDriver也提供了同样多种多样的find_elements_by的方式去定位多个元素。

尽管上述的方式,可以进行元素定位,实际上我们也是更多的用组合的方式进行元素定位。

方法Method

描述Description

参数Argument

示例Example

id

该方法通过ID的属性值去定位查找单个元素

id: 需要被查找的元素的ID

find_element_by_id('search')

name

该方法通过name的属性值去定位查找单个元素

name: 需要被查找的元素的名称

find_element_by_name('q')

class name

该方法通过class的名称值去定位查找单个元素

class_name: 需要被查找的元素的类名

find_element_by_class_name('input-text')

tag_name

该方法通过tag的名称值去定位查找单个元素

tag: 需要被查找的元素的标签名称

find_element_by_tag_name('input')

link_text

该方法通过链接文字去定位查找单个元素

link_text: 需要被查找的元素的链接文字

find_element_by_link_text('Log In')

partial_link_text

该方法通过部分链接文字去定位查找单个元素

link_text: 需要被查找的元素的部分链接文字

find_element_by_partial_link_text('Long')

xpath

该方法通过XPath的值去定位查找单个元素

xpath: 需要被查找的元素的xpath

find_element_by_xpath('//*[@id="xx"]/a')

css_selector

该方法通过CSS选择器去定位查找单个元素

css_selector: 需要被查找的元素的ID

find_element_by_css_selector('#search')

接下来的列表将会详细展示find_elements_by的方法集合。这些方法依据匹配的具体标准返回一系列的元素。

方法Method

描述Description

参数Argument

示例Example

id

该方法通过ID的属性值去定位查找多个元素

id: 需要被查找的元素的ID

find_elements_by_id('search')

name

该方法通过name的属性值去定位查找多个元素

name: 需要被查找的元素的名称

find_elements_by_name('q')

class_name

该方法通过class的名称值去定位查找多个元素

class_name: 需要被查找的元素的类名

find_elements_by_class_name('input-text')

tag_name

该方法通过tag的名称值去定位查找多个元素

tag: 需要被查找的元素的标签名称

find_elements_by_tag_name('input')

link_text

该方法通过链接文字去定位查找多个元素

link_text: 需要被查找的元素的链接文字

find_elements_by_link_text('Log In')

partial_link_text

该方法通过部分链接文字去定位查找多个元素

link_text: 需要被查找的元素的部分链接文字

find_elements_by_partial_link_text('Long')

xpath

该方法通过XPath的值去定位查找多个元素

xpath: 需要被查找的元素的xpath

find_elements_by_xpath("//div[contains(@class,'list')]")

css_selector

该方法通过CSS选择器去定位查找多个元素

css_selector: 需要被查找的元素的ID

find_element_by_css_selector('.input_class')

1、依据ID查找

请查看如下HTML的代码,以便实现通过ID的属性值去定义一个查找文本框的查找:

<input id="search" type="text" name="q" value=""
       class="input-text" maxlength="128" autocomplete="off"/>

根据上述代码,这里我们使用find_element_by_id()的方法去查找搜索框并且检查它的最大长度maxlength属性。我们通过传递ID的属性值作为参数去查找,参考如下的代码示例:

def test_search_text_field_max_length(self):
    # get the search textbox
    search_field = self.driver.find_element_by_id("search")
    # check maxlength attribute is set to 128
    self.assertEqual("128", search_field.get_attribute("maxlength"))

如果使用find_elements_by_id()方法,将会返回所有的具有相同ID属性值的一系列元素。

2、依据名称name查找

这里还是根据上述ID查找的HTML代码,使用find_element_by_name的方法进行查找。参考如下的代码示例:

# get the search textbox
self.search_field = self.driver.find_element_by_name("q")

同样,如果使用find_elements_by_name()方法,将会返回所有的具有相同name属性值的一系列元素。

3、依据class name查找

除了上述的ID和name的方式查找,我们还可以使用class name的方式进行查找和定位。

事实上,通过ID,name或者类名class name查找元素是最提倡推荐的和最快的方式。当然Selenium2 WebDriver也提供了一些其他的方式,在上述三类方式条件不足,查找无效的时候,可以通过这些其他方式来查找。这些方式将会在后续的内容中讲述。

请查看如下的HTML代码,通过改代码进行练习和理解.

<button type="submit" title="Search" class="button">
  <span><span>Search</span></span>
</button>

根据上述代码,使用find_element_by_class_name()方法去定位元素。

def test_search_button_enabled(self):
    # get Search button
    search_button = self.driver.find_element_by_class_name("button")
    # check Search button is enabled
    self.assertTrue(search_button.is_enabled())

同样的如果使用find_elements_by_class_name()方法去定位元素,将会返回所有的具有相同name属性值的一系列元素。

4、依据标签名tag name查找

利用标签的方法类似于利用类名等方法进行查找。我们可以轻松的查找出一系列的具有相同标签名的元素。例如我们可以通过查找表中的<tr>来获取行数。

下面有一个HTML的示例,这里在无序列表中使用了<img>标签。

<ul class="promos">
    <li>
        <a href="http://demo.magentocommerce.com/home-decor.html">
            <img src="/media/wysiwyg/homepage-three-column-promo-
        01B.png" alt="Physical &amp; Virtual Gift Cards">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/vip.html">
            <img src="/media/wysiwyg/homepage-three-column-promo-
        02.png" alt="Shop Private Sales - Members Only">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/accessories/
        bags-luggage.html">
            <img src="/media/wysiwyg/homepage-three-columnpromo-
        03.png" alt="Travel Gear for Every Occasion">
        </a>
    </li>
</ul>

这里面我们使用find_elements_by_tag_name()的方式去获取全部的图片,在此之前,我们将会使用find_element_by_class_name()去获取到指定的<ul>。

具体代码如下:

def test_count_of_promo_banners_images(self):
    # get promo banner list
    banner_list = self.driver.find_element_by_class_name("promos")
    # get images from the banner_list
    banners = banner_list.find_elements_by_tag_name("img")
    # check there are 20 tags displayed on the page
    self.assertEqual(20, len(banners))

5、依据链接文字link查找

链接文字查找通常比较简单。使用find_element_by_link_text请查看以下示例

<a href="#header-account" class="skip-link skip-account">
    <span class="icon"></span>
    <span class="label">ACCOUNT Description</span>
</a>

测试代码如下:

def test_my_account_link_is_displayed(self):
    # get the Account link
    account_link =
    self.driver.find_element_by_link_text("ACCOUNT Description")
    # check My Account link is displayed/visible in
    # the Home page footer
    self.assertTrue(account_link.is_displayed())

6、依据部分链接文字partial text查找

这里依旧使用上述的列子进行代码编写:

def test_account_links(self):
    # get the all the links with Account text in it
    account_links = self.driver.\
    find_elements_by_partial_link_text("ACCOUNT")
    # check Account and My Account link is
    # displayed/visible in the Home page footer
    self.assertTrue(2, len(account_links)) 

7、依据XPath进行查找

XPath是一种在XML文档中搜索和定位节点node的一种查询语言。所有的主流Web浏览器都支持XPath。Selenium2可以用强大的XPath在页面中查找元素。

常用的XPath的方法有starts-with(),contains()和ends-with()等

若想要了解更多关于XPath的内容,请查看http://www.w3schools.com/XPath/

如下有一段HTML代码,其中里面的<img>没有使用ID,name或者类属性,所以我们无法使用之前的方法。亚这里我们可以通过<img>的alt属性,定位到指定的tag。

<ul class="promos">
    <li>
        <a href="http://demo.magentocommerce.com/home-decor.html">
            <img src="/media/wysiwyg/homepage-three-column-promo-
        01B.png" alt="Physical &amp; Virtual Gift Cards">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/vip.html">
            <img src="/media/wysiwyg/homepage-three-column-promo-
        02.png" alt="Shop Private Sales - Members Only">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/accessories/
        bags-luggage.html">
            <img src="/media/wysiwyg/homepage-three-columnpromo-
        03.png" alt="Travel Gear for Every Occasion">
        </a>
    </li>
</ul>

具体代码如下:

def test_vip_promo(self):
    # get vip promo image
    vip_promo = self.driver.\
    find_element_by_xpath("//img[@alt='Shop Private Sales - Members Only']")
    # check vip promo logo is displayed on home page
    self.assertTrue(vip_promo.is_displayed())
    # click on vip promo images to open the page
    vip_promo.click()
    # check page title
    self.assertEqual("VIP", self.driver.title)

当然,如果使用find_elements_by_xpath()的方法,将会返回所有匹配了XPath查询的元素。

8、依据CSS选择器进行查找

CSS是一种设计师用来描绘HTML文档的视觉的层叠样式表。一般来说CSS用来定位多种多样的风格,同时可以用来是同样的标签使用同样的风格等。类似于XPath,Selenium2也可以使用CSS选择器来定位元素。

请查看如下的HTML文档。

<div class="minicart-wrapper">
    <p class="block-subtitle">Recently added item(s)
        <a class="close skip-link-close" href="#" title="Close">×</a>
    </p>
    <p class="empty">You have no items in your shopping cart.
    </p>
</div>

我们来创建一个测试,验证这些消息是否正确。

def test_shopping_cart_status(self):
    # check content of My Shopping Cart block on Home page
    # get the Shopping cart icon and click to open the
    # Shopping Cart section
    shopping_cart_icon = self.driver.\
    find_element_by_css_selector("div.header-minicart
                                 span.icon")
    shopping_cart_icon.click()
    # get the shopping cart status
    shopping_cart_status = self.driver.\
    find_element_by_css_selector("p.empty").text
    self.assertEqual("You have no items in your shopping cart.",
    shopping_cart_status)
    # close the shopping cart section
    close_button = self.driver.\
    find_element_by_css_selector("div.minicart-wrapper
                                 a.close")
    close_button.click()

特殊 iframe 操作

iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。

iframe: 紫禁城

在一个<html>中,包含了另一个<html>

示例

<html>
  <head>
    <title>iframe示例</title>
  </head>
  <body>
    <h1>
      这里是H1,标记了标题
    </h1>
    <p>
      这里是段落,标记一个段落,属于外层
    </p>
    <div>
      <iframe id="iframe-1">
        <html>
          <body>
            <p>
              这里是个段落,属于内层,内联框架中的
            </p>
            <div id="div-1">
              <p class="hahahp">
                这里是div中的段落,需要被定位
              </p>
            </div>
          </body>
        </html>
      </iframe>
    </div>
  </body>
</html>

需要定位上面示例中的<p>:这里是div中的段落,需要被定位

如下是selenium WebDiriver的代码

## 查找并定位 iframe
element_frame = driver.find_element_by_css_selector('#iframe-1')
## 切换到刚刚查找到的 iframe
driver.switch_to.frame(element_frame)
## 定位 <p>
driver.find_element_by_css_selector('#div-1 > p')
## TODO....
## 退出刚刚切换进去的 iframe
driver.switch_to.default_content()

特殊 Select 操作

<select> 是选择列表

Select 是个selenium的类selenium.webdriver.support.select.Select

Select 类的路径:

C:\Python35\Lib\site-packages\selenium\webdriver\support\select.py

<select id="brand">
  <option value ="volvo">Volvo</option>
  <option value ="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

示例,选择 Audi

## 查找并定位到 select
element_select = driver.find_element_by_css_selector('#brand')
## 用Select类的构造方法,实例化一个对象 object_select
object_select = Select(element_select)
## 操作 object_select
object_select.select_by_index(3)
## 也可以这样
object_select.select_by_value('audi')
## 还可以这样
object_select.select_by_visible_text('Audi')

组合操作

自动化经验的积累,需要100%按照手工的步骤进行操作。

比如步骤如下:

  1. 点击一个 <a id="customer_chosen">
  2. 自动产生了一个 <ul id="customer_list">
  3. 点击<ul>的第五个<li>

代码示例

driver.find_element_by_css_selector('#customer_chosen').click()
sleep(1)
driver.find_element_by_css_selector('#customer_list > li:nth-child(5)')

作为过来人的一些忠告

最后,作为过来人,给所有测试员一些忠告~~一名测试员,你真的不该只会点点点~随着体系的改变,对于现在的测试人员来说,不是自动化或者代码有多重要,而是懂自动化,懂代码,能够理解系统的实现,已经变成了必备技能。

自动化测试到底应该学什么?

1、建议是学 selenium,开源的,免费的,你可以下载源码研究,去了解其原理,再者 selenium 测试思路和手工测试类似,学起来比较轻松。

2、不建议学 seleniumIDE 录制,当然你可以通过录制一些然后转换为相应的脚本去学习,等你学好了 selenium,再去学 appium 你会有一种天然的似曾相识。为什么不建议学 QTP/UFT?因为收费/臃肿/现在做桌面软件测试的工作已经不太多了。

3、关于买书,看书能够提高一定的理论知识,但是解决不了实际问题,自动化测试的能力还是要靠一行一行代码敲出来的。

结语

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。欢迎留言,或是关注我的专栏和我交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值