使用Selenium开始测试前,你需要知道两条最基本的信息:你想要用的页面元素是哪些和你想要用他们做些什么。这两点日后就会像你的双拳一样,不断发威、重复出击直到达到你测试某一个程序的最终工作目标——这个目标达成的时候也就是你判定到此阶段这些执行的结果是你预期结果的时候。
以登录一个网站为例。Selenium可以:
访问该网站的登录页面
找到登录表单的用户名字段并输入用户名
找到登录表单的密码字段并输入密码
找到并单击“提交”按钮
Selenium能够通过不同的定位策略找到页面上的元素并与之进行交互。其中包括(按字母顺序排序):
类Class
CSS选择器
ID
链接文本
Name
部分链接文本
标签名
XPath
每个元素都有其存在的目的,但现在你只需要知道几个就可以开始编写有效的测试。
如何找到定位器找到定位器最简单的方式就是去检查页面上的元素。现下主流的浏览器都有预装开发工具,你可以通过已有的浏览器检查到这些页面元素,轻松完成这一步。
查看页面时,右键点击你想要检查的元素并单击检查,这时页面会弹出一个小窗口,所有页面的标记都在其中显示,从这个窗口中你可以查看到页面上所有独特属性或描述性的属性以便你使用。
如何找到高质量的元素你想要找的应该是一个惟一的、描述性的、不太可能更改的元素。
成熟的候选对象是id和class属性。而文本(例如,链接的文本)则不太理想,因为它更容易改变。当然这一点可能不成立,如果你想尝试的话,这也是一个很好的目标。
如果你试图使用的元素身上并没有唯一的id或类属性,那么可以查看包含他们的元素(即父元素)。通常,父元素都会有一个独特的元素,你可以利用这个独特的元素指向你想要使用的那个子元素。
当你找不到任何独特的元素时,就要与开发团队沟通,让他们知道你想要达到的目标。对于他们来说,为页面添加有用的语义标记使其更加利于测试,是一件微不足道的事情——特别是当他们知道你想要自动化测试时。寻找拎一个替代方案可能会是一个漫长而痛苦的过程,最后可能会产生一份测试代码,但它会变得脆弱,难以维护。
一旦你确定了测试的目标元素,就进入到使用到Selenium策略来创建一个定位器的阶段了。
实战部分(一个例子)第1部分:找到元素,编写测试
这是标准的登录表单的标记(在互联网上搞到的登录的例子)。
请注意表单中的独特元素。 用户名输入字段具有唯一的ID,密码输入字段也是如此。 提交按钮没有,但它是页面上唯一的按钮,所以我们可以很容易地找到它并点击它。
让我们把这些元素用于我们的第一个测试。 首先,我们需要在项目目录的根目录下创建一个名为tests的新文件夹。 其中我们将创建一个名为login_test.py的新测试文件和一个名为__init__.py的目录必需Python文件。 当我们完成创建后,我们的目录结构应该是这样的。
下面是我们将要在测试文件中添加的代码,来使用selenium命令和创建定位器。
在导入pytest和Selenium的必需类之后,我们首先声明一个测试类,例如,class TestLogin() ,然后我们在类中声明一个名为driver的方法。之后,我们添加一个装饰器来表示这是一个fixture,例如,pytest.fixture ,这样在pytest中默认地,所有测试方法会调用fixture方法,因此,我们可以使用这个方法来对我们的Selenium实例进行setUp初始,或tearDown回收初始化数据垃圾。
装饰器的作用,可参考知乎《如何理解Python装饰器?》:https://www.zhihu.com/question/26930016
创建一个Selenium实例,我们先调用webdriver. firefox()并将其存储在一个变量中。由于该方法实际上是个驱动程序,因此这里我们将此变量称为driver_。这个变量将在该方法的末尾返回,这个地方我们的测试中很快就会用到。
方法有两个参数self和request。self是类方法的必需参数;request是可用于fixture的参数,测试运行期间利用它可以访问大量的东西。另外还有一个相关的方法:request.addfinalizer。测试方法完成后会传递给addfinalizer。因此我们调用driver_. quit()并将其传递到addfinalizer方法中。
我们的测试方法从这个词开始:test_(这使得pytest知道该方法是一个测试)。它有两个参数,self和driver。driver让我们访问到之前在类顶部创建的fixture方法。该方法会返回一个浏览器实例,我们可以使用Selenium命令来引用这个变量目录。在这个测试中,我们通过它的URL访问登录页面(driver.get()),通过ID找到输入字段(driver.find_element(By.ID, "username")),在输入框中输入文本(使用.send_keys()),然后单击提交按钮提交表单(例如,By.CSS_SELECTOR,"button").click() )。
保存该文件并运行py.test,它就会逐步执行了。但有一件事缺失了——断言(assertion)。为了找到一个元素来写断言,我们需要看到提交登录表单后的页面的标记是什么。
第2部分:找出进行Assert断言的部分
下面显示的是登录后包含页面标记的代码。
在这种标记中,我们可以使用一些元素来进行断言,这里有flash massage(最吸引人)的类,logout按钮(有吸引力),或者是h2或flash massage的副本(最不吸引人)。
由于flash massage的类名是描述性的,表示一个成功的登录,相较于其副本不太可能会改动,所以我们选它。
当我们试图访问这样的元素时(例如,多个词连接起来命名的类),我们将需要使用一个CSS选择器或XPath。
注意:CSS选择器和XPath这两个方式效果都不错,但本课程中的例子都选择CSS选择器。
CSS选择器快速入门
在网页设计中使用CSS(层叠样式表)将样式应用到页面上的标记(HTML)。CSS是能做到这一点通过声明的哪位标记它想改变通过使用选择器。硒在类似的方式运营,而是改变元素的风格,这与他们通过点击,获取值,打字,送钥匙,等等。
CSS选择器是一个非常简单和方便的方式编写定位器,特别是难以到达的元素。
在web设计中,CSS(层叠样式表)用于将样式应用于页面上的带标记部分(HTML)。CSS选择器通过声明来改变标记区的特定部分来实现这一点。Selenium以类似的方式运行,但是它没有改变元素的样式,而是通过单击、获取值、键入、send key等来与它们交互。
CSS选择器是一种非常简单、方便的编写定位器的方法,特别是对于很难到达的元素。
现在,你需要知道的是。在CSS中,类名以点(.)开头。对于有多个单词的类,在每个单词前面加一个点,并删除它们之间的空间(例如,.flash.success来表示 class='flash success')。
第3部分:编写Assertion进行验证
有了定位器后,我们再添加一个验证它的Assert部分。
With assert we are checking for a true Boolean response. If one is not received the test will fail. With Selenium we are seeing if the success message element is displayed on the page (with .is_displayed). This Selenium command returns a Boolean. So if the element is rendered on the page and is visible (e.g., not hidden or covered up by an overlay), true will be returned, and our test will pass.
When we save this and run it it will run and pass just like before, but now there is an assertion which will catch a failure if something is amiss.
利用Assert我们可以检测到布尔响应的true值。如果没有收到,测试就代表失败。Selenium命令.is_displayed 会返回布尔值,通过判断返回的是True还是False可以知道测试是否成功。如果元素在页面上呈现,并且是可见的(例如,没有被覆盖),true将被返回,就代表我们的测试通过了。
当我们保存并运行文件时,它会像以前一样运行;不同的是,添加了Assert部分之后,如果有什么事情出错将会返回失败信息。
再确保一下为了确保这个测试正在做我们认为应该做的事情,让我们尝试人为改变Assert部分中的定位器,尝试强制失败并再次运行。 一个简单的定位器名称错误就足够了。
下节课,我们将学习编写可维护的测试代码。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved