driver.find_find elements by_by_id("kw").send_keys("S")提示 'list' object has no a

5个最佳安卓测试框架(带示例)
我的图书馆
5个最佳安卓测试框架(带示例)
翻译, 校稿。未经许可,禁止转载!英文出处:。欢迎加入。Google的Android生态系统在持续快速扩大。新的移动设备厂商正在世界各个角落涌现,由此出现了各种不同的屏幕大小、不同的ROM/固件、不同的芯片等等。这对于安卓开发者而言,成为了难以对付的生态碎片。幸运的是,Android(包括iOS)的开发者们已可以不受限制地获得一些先进的基于云的解决方案,比如,用以在大规模真实的设备上运行自动化测试来保证质量。不同Android测试框架的出现在很大程度上减轻了Android开发者的负担。今天我们将了解5个最佳Android测试框架,讲解每一个的基本原理和代码实例。Robotium毫无疑问,早期Android世界里用得最为广泛的测试框架就是。它与Selenium的Android版本有类似之处,可以让测试API更简单。Robotium是一个开源的库,基于JUnit扩展了大量关于Android UI的有效测试方法。它为 Android 应用程序(原生和混合)和web 测试提供了功能强大且可靠的自动化黑盒测试用例。只要源码可用,利用Robotium,你就可以编写功能测试、系统测试和验收测试场景,并执行测试。 Robotium代码示例:
12345678910111213141516171819202122
//Public void 方法public void testRecorded() throws Exception {&& &//等待文本“Hello”显示&& &if (solo.waitForText('Hello!')) {&& &&& &//找到R类id标识符为'Sign in'的控件-然后点击它&& &&& &solo.clickOnView(solo.findViewById('com.twitter.android.R.id.sign_in'));&& &&& &//找到用户名的控件并输入登陆用户名&& &&& &solo.enterText((EditText) solo.findViewById('com.twitter.android.R.id.login_username'),'username');&& &&& &//找到密码的控件并输入登陆密码&& &&& &solo.enterText((EditText) solo.findViewById('com.twitter.android.R.id.login_password'),'password');&& &&& &//找到登陆按钮,点击登陆&& &&& &solo.clickOnView(solo.findViewById('com.twitter.android.R.id.login_login'));&& &&& &//等待登陆完成&& &&& &solo.waitForActivity('HomeTabActivity');&& &}&& &//激活文本域来编写一个tweet&& &solo.clickOnView(solo.findViewById('com.twitter.android.R.id.menu_compose_tweet'));&& &//编辑tweet&& &solo.enterText((EditText) solo.findViewById('com.twitter.android.R.id.edit'), 'Testdroid');&& &//推送tweet中!&& &solo.clickOnView(solo.findViewById('com.twitter.android.poser_post'));}
Testdroid Recorder&是一个很棒的记录工具,它基于Robotium来创建测试脚本为你带来方便。通过在真正设备上执行实际操作,它可以记录每个步骤或者你执行的动作,然后转换为Javascript供你进一步修改。此外,你也可以完全和使用我们的扩展库——ExtSolo。它包括了一些尚未合并到Robotium的有用方法,比如:支持任意分辨率的x、y点击自动缩放多路径拖拽测试失败时自动截屏模拟位置修改设备语言控制WiFi连接uiautomatorRobotium这个框架不错但稍显简单。可以让你在测试Android app和游戏时实现更多操作。Google的测试框架(译者注:uiautomator是Google在SDK4.0以后推出的自动化解决方案)支持在一个或多个设备上测试本地Android app用户界面(UI)。uiautomator的另一个优点是它运行JUnit测试用例时有特权,意味着测试用例可以跨进程。它还提供了五个不同的类给开发者使用,包括:
com.android.uiautomator.core.UiCollection;com.android.uiautomator.core.UiDevice;com.android.uiautomator.core.UiObject;com.android.uiautomator.core.UiScrollable;com.android.uiautomator.core.UiSelector
由于它出现的时间点关系,它只适用于与API级别为16(译者注:相当于SDK4.1)或更高版本的Android设备。Uiautomator的另一个缺点是它不支持webview,没有办法到直接获取到Android的UI对象。 uiautomator的代码示例:
1234567891011121314151617181920212223242526272829303132333435
//Public void 方法public void testSignInAndTweet() throws Exception {&& &//启动应用&& &getUiDevice().wakeUp();&& &//点击Home键以保证回到主屏&& &getUiDevice().pressHome();&& &//选择“应用”并点击&& &new UiObject(new UiSelector().description('Apps')).click();&& &//选择“Twitter”并点击&& &new UiObject(new UiSelector().text('Twitter')).click();&& &//定位并选择“登陆”&& &UiSelector signIn = new UiSelector().text('Sign In');&& &//如果按钮可用,则点击&& &UiObject signInButton = new UiObject(signIn);&& &if (signInButton.exists()) {&& &&& &signInButton.click();&& &//设置用户名&& &&& &new UiObject(new&& &&& &&& &UiSelector().className('android.widget.EditText').instance(0)).setText('username');&& &&& &new UiObject(new&& &&& &&& &UiSelector().className('android.widget.EditText').instance(1)).setText('password');&& &&& &new UiObject(new UiSelector().className('android.widget.Button').&& &&& &&& &text('Sign In').instance(0)).click();&& &//等待登陆处理&& &&& &getUiDevice().waitForWindowUpdate(null, 2000);&& &// 等待主窗口&& &&& &getUiDevice().waitForWindowUpdate(null, 30000);&& &}&& &new UiObject(new UiSelector().description('New tweet')).click();&& &//编辑一个新tweet&& &new UiObject(new UiSelector().className('android.widget.LinearLayout').instance(8)).&& &setText('Awesome #Testdroid!');&& &//推送tweet&& &new UiObject(new UiSelector().text('Tweet')).click();}
Espresso是一个最新的Android自动化测试框架,由Google开源,它可以帮助开发和测试推敲UI的设计。Espresso有一个很小、可预测的且容易上手的API,它构建在&框架的顶层。你可以利用它快速写出简洁可靠的Android UI测试用例。它支持API级别为8(Froyo)、10 (Gingerbread)和 15 (Ice Cream Sandwich)及之后的设备。它相当可靠,与UI线程同步并且速度快,因为没有必要做任何休眠等待的操作(当app空闲时测试运行在同一个毫秒级别)。不过它同样不支持webview。 Espresso的代码示例:
123456789101112131415161718192021222324252627282930313233
public void testEspresso() { // Check if view with the text 'Hello.' is shown //如果带有文本“Hello”的控件显示,则点击 onView(withText('Hello.')).check(matches(isDisplayed())); // R class ID identifier for 'Sign in' - and click it //找到R类id标识符为'Sign in'的控件-然后点击它 onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/sign_in', null, null))).perform(click()); // R class ID identifier for entering username //找到用户名的控件并输入登陆用户名 onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/login_username', null, null))).perform((typeText('username'))); // R class ID identifier for entering password //找到密码的控件并输入登陆密码 onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/login_password', null, null))).perform((typeText('password'))); // R class ID identifier for clicking log in //找到登陆按钮,点击登陆 onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/login_login', null, null))).perform(click()); // Activate the text field to compose a tweet //激活文本域来编写一个tweet onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/menu_compose_tweet', null, null))).perform(click()); // Type the tweet //编辑tweet onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/edit', null, null))).perform((typeText(”#Testdroid'))); // Tweeting! //推送tweet中! onView(withId(getInstrumentation().getTargetContext().getResources() .getIdentifier('com.twitter.android:id/composer_post', null, null))).perform(click());}
Calabash是一个跨平台的自动化测试框架,支持Android、iOS原生和混合的应用测试。Calabash的语法通俗易懂,甚至技术零基础的人也能为运行在各种移动平台上的应用编写和执行自动化验收测试用例。Calabash的测试用例编写是基于Cucumber(译者注:Calabash的底层实现是Cucumber,它是一种BDD测试框架),然后在运行时将脚本转换为Robotium或者Frank。它支持大约80种自然语言命令(控制器),并且可以用Ruby或Java实现新的控制器。 Calabash的代码示例:
12345678910
Feature: Login featureScenario: As a valid user I can log into my appI wait for text "Hello"Then I press view with id "Sign in"Then I enter text "username" into "login_username"Then I enter text "password" into "login_password"Then I wait for activity "HomeTabActivity"Then I press view with id "menu_compose_tweet"Then I enter text "Testdroid" into field with id "edit"Then I press view with id "composer_post"
Appium是一个移动自动化测试框架(工具),可支持iOS和Android的原生、混合的移动web应用测试。它内部采用的来与iOS和Android app交互。它通过驱动uiautomator(API级别高于等于16)和Seledroid(API级别低于16)支持Android,驱动UIAutomation来支持iOS,利用Selenium driver来支持 Android和iOS都有的移动web。Appium最大的一个优点就是几乎可以使用任何一种语言(比如Java、Objective-C、JavaScript、PHP、Ruby、Python、C#等)来编写Appium脚本,不受工具选择的限制,兼容两个最重要的平台(Android和iOS),安装和配置设备来测试等也自由许多。而且如果你对Selenium很熟悉,那么对你而言使用Appium测试移动app轻而易举。他们使用的是相同的WebDriver,且DesiredCapabilities(译者注:DesiredCapabilities是由客户端发送给Appium服务器端用来告诉服务器去启动哪种会话的一套键值对集合)的使用方式相同。因此在Appium上配置运行一个应用与在Selenium上有非常多相似之处。 Appium的代码示例:
12345678910111213141516171819202122232425262728293031
# wait for hello#等待hello出现sleep(3)textFields = driver.find_elements_by_tag_name('textField')assertEqual(textFields[0].get_attribute('value'), 'Hello')# click sign-in button#点击登陆按钮driver.find_elements_by_name('Sign in')[0].click()# find the text fields again, and enter username and password#找到文本域,然后键入用户名和密码textFields = driver.find_elements_by_tag_name('textField')textFields[0].send_keys('twitter_username')textFields[1].send_keys('passw0rd')# click the Login button (the first button in the view)#点击登陆按钮(控件中的第一个按钮)driver.find_elements_by_tag_name('button')[0].click()# sleep#休眠sleep(3)# click the first button with name 'Compose'#点击名字为'Compose'的第一个按钮driver.find_elements_by_name('Compose')[0].click()# type in the tweet message#键入tweet消息内容driver.find_elements_by_tag_name('textField')[0].send_keys(”#Testdroid is awesome!')# press the Send button#点击发送按钮driver.find_elements_by_name('Send')[0].click()# exit#退出driver.quit()
总结在这里我们列出了5种最佳测试框架,它们支持Android的构建、创立和修改。当然,每一种都有其优势和劣势。Appium适合于同时测试应用的Android和iOS版。但是如果你是一个忠诚的Android开发者,只编写Android版本的应用,那么使用Robotium就不错。借助于Testdroid Recorder来生成测试脚本绝对会让你节省大量的时间和钱(它是免费的!)。因此,慎重考虑你的测试需求-功能测试,兼容性测试,UI测试等等,然后选择一个最适合和最优的Android测试框架。 加入伯乐在线专栏作者。扩大知名度,还能得赞赏!详见《》
关于作者:
熟悉 java、liunx、php、mysql、hadoop、storm、hbase、redis、spring 等技术,在自动化测试、持续集成等领域有丰富经验。新浪微博:
TA的最新馆藏[转]&[转]&[转]&
喜欢该文的人也喜欢appium自动化测试(3)-控件定位&中文输入
时间: 11:08:29
&&&& 阅读:254
&&&& 评论:
&&&& 收藏:0
标签:参考-控件定位&
appium接口&
◆&控件定位就是精确的描述控件特征并告诉机器的过程。控件的特征就是控件的属性,可以通过上一讲中的uiautomatorviewer去获取。以下是方法:
1、通过resourceID获取&driver.find_element_by_id("com.android.contacts:id/menu_add_contact").click()
2、通过name:findElementByName( "name")
3、findElementByClassName(&classname&)
4、findElementByAccessibilityId()在安卓上等同于contentDescription
◆ 中文输入法:乱码&输入中文报错的解决方法
#coding=utf-8
import time
from appium import webdriver
desired_caps ={}
desired_caps[‘platformName‘]=‘Android‘
desired_caps[‘platformVersion‘]=‘4.4.4‘
desired_caps[‘deviceName‘]=‘Android Emulator‘
desired_caps[‘appPackage‘]=‘com.XX.activity‘
desired_caps[‘appActivity‘]=‘.XXSearchActivity‘
desired_caps[‘unicodeKeyboard‘]=True
desired_caps[‘resetKeyboard‘]=True
driver = webdriver.Remote(‘http://localhost:4723/wd/hub‘, desired_caps)
driver.find_elements_by_name("搜索话题")
driver.find_element_by_class_name("android.widget.EditText").send_keys(u"可爱")
# driver.find_element_by_id(‘et_searchactivity_search‘).send_keys(u"可爱")
driver.find_element_by_name("搜索").click()
time.sleep(5)//在页面暂停5秒
driver.quit()
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!Selenium自动化测试-入门 - CSDN博客
Selenium自动化测试-入门
一、什么是Selenium
Selenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下:开源、免费;多平台、浏览器、多语言支持;对web页面有良好的支持;API简单灵活易于使用;支持分布式测试用例执行。
Selenium经历了两个版本,Selenium1.0和2.0,Selenium1.0主要由以下几部分构成:
Selenium IDE:是一个嵌入到Firefox中的插件,可以实现浏览器的录制于回放功能。
Selenium Grid:自动化测试辅助工具,可以很方便地同时在多台机器上并行运行多个测试事例。
Selenium RC:是Selenium的核心工具,支持多种不同的语言编写的测试脚本,通过Selenium RC的服务器作为代理服务器去访问应用从而达到测试的目的。主要分为以下两部分:
Client:用来编写测试脚本来控制Selenium server的库。
Server:负责控制浏览器的行为,包含三部分:Launcher;HttpProxy;Core。
明白了Selenium1.0的家族关系,Selenium2.0可以简单的认为是将WebDriver加入到了Selenium RC这一部分中去。那么Selenium RC和WebDriver有什么区别呢?
RC和 WebDriver 类似,都可以看做是一套操作web页面的规范。当然,他们的工作原理不一样。
Selenium RC 在浏览器中运行 JavaScript 应用,使用浏览器内置的 JavaScript 翻译器来翻译和执行selenese 命令(Selenium 命令集合) 。
WebDriver 通过原生浏览器支持或者浏览器扩展直接控制浏览器。WebDriver 针对各个浏览器而开发,取代了嵌入到被测 Web 应用中的 JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript 安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver 还利用操作系统级的调用模拟用户输入。
以后我们基本都用Selenium2.0来进行学习和脚本编写,并且选定Python语言作为编写脚本的语言,其实各种语言编写脚本都大同小异。
二、Selenium环境搭建
1. 安装Python
这里暂时只说windows下的。访问Python官网:选择下载Python2或者3系列,直接点击安装,注意勾选将其自动添加至系统环境变量中,并且勾选自动安装pip,便于我们直接从cmd中使用。具体步骤不再多说,网上教程很多。
2. 安装Selenium
安装好了Python环境之后,我们直接用pip install Selenium命令来安装Selenium。
3. 安装浏览器驱动
这里我们需要知道的是Firefox的驱动已经集成在了Selenium WebDriver包中了,不用我们自己安装了。下面看一个简单了例子:
#coding=utf-8
from Selenium import webdriver
#浏览器驱动
driver=webdriver.Firefox()
driver.get("")
driver.find_element_by_id("kw").send_keys("Selenium2")
driver.find_element_by_id("su").click()
driver.quit()
这个简单的例子做的事是:打开Firefox,访问百度首页,输入Selenium2关键字进行搜索,退出。运行它,我们可以看见以下页面:
如果我们想要使用其他的浏览器呢?首先必须要下载响应浏览器的驱动,我们可以访问来下载相关的驱动,并将其放在系统路径中。比如我们这里把Firefox改为Chrome,再运行程序可以看见:
4. 其他工具安装
这里我们主要使用Firefox来进行演示,还需要安装一些插件来方便我们后面的控件抓取。可以直接访问来搜索和安装一些插件,比如常用的XPath和Firebug等。
环境搭建完成以后我们要做的就是开始学习编写脚本的API了。
三、WebDriver API
本节的内容是,在Python语言中,如何通过Selenium WebDriver提供的各种方法来实现web自动化测试。我们会学习一下各种操作web页面的API。这里推荐一个特别好的写示例Demo用的网站,它里面基本可以找到我们需要的所有场景。
1. 定位元素
通过firebug等工具我们可以看见页面上的各种元素,如下图:
每个元素都有不同的标签名和属性名等,Selenium可以通过这些来定位元素。在WebDriver中有以下定位元素的方法:
class name
partial link text
css selector
对应的在Python中定位的方法如下:
find_element _by_id()
find_element _by_name()
等等八种方式(仅仅更换了关键字)。
上面这些定位方式除了最后两种外,我们只需要看它的名字就很明显可以知道,它到底是怎么定位的。但是有个问题是?我们怎么得到这些属性,可以看见即使通过firebug或查看源码去观察元素时,也是比较麻烦和不直观的。这里我们就要用到最后这两种强大的工具了。
XPath定位:
在前面我们说到了安装XPath工具,如果安装成功了之后,在一个网页的任意位置,单击右键可以看到以下页面:
通过firebug可以看出来一些元素的属性等信息,如以下片段是搜索框和按钮的信息:
class="bg s_ipt_wr quickdelete-wrap"&
class="soutu-btn"&&
id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off"&
id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0 right: 0 display:"&&
class="bg s_btn_wr"&
id="su" class="bg s_btn" value="百度一下" type="submit"&
图中我们是在百度搜索的搜索框中点击了右键,选中XPaths之后,可以看到显示出了很多种定位此元素的方法,从中我们也可以得到此元素的各种信息。这时在相应的方法上单击右键或左键就可以将其复制下来。
使用绝对路径定位 很显然我们要定位一个元素的话,可以从第一层一直往下找,最终一定会找到这个元素的:
可以从上图看到,如果想定位到搜索框的话,采用绝对路径定位的话,其层级有十层之多,太烦人类了!
使用元素属性定位 我们来分析一下这种格式,比如//input[@id='kw'],如果要在脚本中使用的话,应该是find_element_by_xpath("//input[@id='kw']"),这里的//表示当前页面的某个目录下,input表示定位元素的标签名,[@id=’kw’]表示这个元素的id属性值为kw。同理我们还可以用其他的属性值来定位,如name、class,元素的任意属性值都可以用,只要它可以标识唯一的一个元素。
如果属性有重复的话,可以使用逻辑运算符来连接多个属性从而区别其他属性。比如:find_element_by_xpath("//input[@id='kw' and @name='wd']")。
CSS选择器定位
css选择器可以方便的选择控件的任意属性,一般情况下比XPath速度要快,但是有一定的学习成本。可以访问来获取css选择器的所有使用方式。部分语法如下:
根据以上语法,我们可以使用
driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector("map&area")
等等方式来定位元素。可以使用如下方式得到CSS层级:
复制之后,粘贴出来可以看到如下字符串:
html body div#wrapper div#head div.head_wrapper div.s_form div.s_form_wrapper.soutu-env-nomac.soutu-env-index div#lg map area
可以得到规律:层级之间用空格分隔,元素定位的方式会展示出来。(如,使用标签名的html、使用class的div.s_form、使用id的div#lg等等)所以我们上面可以使用map&area(父标签&子标签)来定位百度首页那张图片的位置。
关于更多CSS选择器的用法不做更多的解释了,可以查看官方文档等方式来查看使用方法!我们可以熟练的使用XPath或CSS选择器中的一种,就可以解决大部分定位的问题了。
2. 控制浏览器
控制浏览器窗口大小:
driver=webdriver.Firefox()
#设置窗口大小为x,y
driver.set_window_size(x,y)
#最大化窗口
driver.maxmize_window()
控制浏览器前进后退:
类似于点击前进后退按钮,实现页面切换。要注意的是,我们打开的页面是不是新建了一个标签页,是不是有上级页面可以返回。
driver=webdriver.Firefox()
driver.get("")
driver.find_element_by_css_selector("div#u1&a.mnav").click()
driver.back()
driver.forward()
3. 元素操作
当我们获取了元素之后,还要对其进行操作,如点击按钮、输入文字、提交表单等。大多数页面交互的方法通过WebElement接口提供,常用的有:
清除文本框中的文本
send_keys(*value) 模拟按键输入
click() 单击元素
这几个方法很简单,很方便使用。
submit() 用于提交表单,例如搜索框中的提交按钮。比如我们可以用如下代码直接输入搜索的关键字后用submit()提交,而不用获取搜索按钮再点击。
driver.find_element_by_css_selector("#kw").send_keys("selenium2").submit()
还有几个常用的方法:
size() 获取元素的大小尺寸
text()获取元素的文本
is_displayed()元素是否可见
4. 鼠标、键盘事件
模拟鼠标右键、双击、悬停、拖拽等操作,会用到ActionChains类。mon.action_chains.ActionChains(driver)当调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,队列中的时间会依次执行。
ActionChains方法列表:
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移到距某个元素(左上角)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
这些鼠标键盘事件相对来说用的并不是很多,我们只需要熟练使用最常用的那些,剩下的都差不多。
5. 获取验证信息
我们在编写功能测试用例时,一般会有预期结果,在自动化用例执行完成之后,我们可以从页面上获取一些信息来验证用例是执行失败还是成功。最常用的几种如下:
driver.title -获取当前页的title
driver.current_url -获取当前页面URL
driver.find_element_by_...(...).text -获取当前控件的text信息
6.设置等待时间
显示等待: - 主要使用的类和方法:WebDriverWait、uitil\until_not、Expected Conditions。
请看以下简单示例:
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver=webdriver.Firefox()
driver.get("/")
element=WebDriverWait(driver,5,0.5).until(EC.title_is(U"腾讯首页"))
print(element)
这里调用WebDriverWait来实现,在默认的一段时间内,每隔一段时间检测一次当前的页面指定元素是存在。
WebDriverWait()
如图所示,WebDriverWait有四个参数,WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None),分别是:driver;超时时间,检测间隔;超时后的异常信息。
until()和until_not()
WebDriverWait()一般和until()或until_not()配合使用,until(method,message=’ ‘)
调用该方法提供的驱动程序作为一个参数,直到返回值为true,同理可知道until_not(method,message=’ ‘),调用该方法提供的驱动程序作为一个参数,直到返回值应该为false。
其中的参数method,应该使用什么方法呢?这里就要用到另一个常用的类了:
expected_conditions
注意,在上面的code中我们用as将其重命名为了EC,这个类有很多种方法可以选用:
可以看到里面有很多的方法可以用来判断是否存在相应的元素。当然这里的method我们也可以用其他的方法,比如:WebDriverWait(driver,5,0.5).until(lambda driver: driver.find_element_by_xpath("//a[@bosszone='news_n']")),用这样的方式来判断是否显示出了响应的元素。
隐式等待: - implicitly_wait
隐式等待相对于显式等待就要简单多了,driver.implicitly_wait(n),n代表等待的秒数, 隐式等待相当于设置全局的等待,在定位元素时,对所有元素设置超时时间,超出了设置时间则抛出异常,默认是0。如果元素定位不到,则以轮询的方式不断定位,直到超时时间到达。
强制等待-sleep休眠方法: - Python的time模块提供,sleep(n),n为秒数。程序执行到这里的时候,强制暂停所设置的时长。
7. 定位一组元素
在前面我们说到了8种定位方法,是对单元素定位的。WebDriver还提供了与之对应的8种定位方法用于定位一组元素。区别在于element后面加了一个s,如下:
find_elements_by_id()
find_elements_by_name()
一般用于以下场景:
批量操作对象:如将所有的复选框选中\取消选中
先获取一组对象,然后在这组对象中过滤出具体定位的对象
8. 多表单、多窗口切换
多表单页面:如图所示我们如果直接操作,去点击Link Test(frame中的元素),是不可以的,因为我们首先需要切换到这个frame里面才可以进行操作。
通过firebug工具可以得到此页面的源码,便于我们定位元素:
switch_to_frame(参数)方法,参数可以是iframe的id、name,如果没有的话,也可以传入locator;switch_to_default_content()方法,用来返回上一层表单,默认与据它最近的switch_to_frame方法对应。
#coding=utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("/demo/iframesTest.htm")
#切换到frame里面去
driver.switch_to_frame(driver.find_element_by_xpath("/html/body/iframe"))
driver.find_element_by_link_text("Link Test").click()
#退出至上一层表单
driver.switch_to_default_content()
多窗口切换:如果我们打开了多个窗口,然后想切换到其中的一个窗口呢?那就要用到switch_to_window这个方法了,请看如下代码片段:
driver=webdriver.Firefox()
driver.get("/")
#获取qq首页窗口句柄
first_windows=driver.current_window_handle
driver.find_element_by_xpath("//a[@bosszone='news_n']").click()
#当前所有打开的窗口句柄
all_handles=driver.window_handles
#进入到首页窗口
for handle in all_handles:
if handle==first_windows:
driver.switch_to_window(handle)
print("In first_windows")
#从首页打开"图片"页
driver.find_element_by_xpath("//a[@bosszone='photo_n']").click()
9. 警告框处理
在WebDriver中处理js生成的alert、confirm、prompt是很简单的,即用switch_to_alert()方法定位到弹出框,再使用text/accept/dismiss/send_keys进行操作。看如下代码片段:
# coding=utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("/")
driver.find_element_by_css_selector("div#u1 a.pf").click()
#点击编辑设置
driver.find_element_by_class_name("setpref").click()
time.sleep(1)
driver.find_element_by_css_selector("div#gxszButton&a.prefpanelgo").click()
time.sleep(1)
driver.switch_to_alert().accept()
10. 操作滚动条&截图
操作滚动条:
可以使用js脚本,拖动到指定地方,用
driver.execute_script("arguments[0].scrollIntoView();", target),这个方法来拖动滚动条到指定的地方。其实元素没在一屏,也可以直接定位并点击的。
# coding=utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("/")
#定位到“体育社区”
target = driver.find_element_by_xpath("//a[@href='/fans/']")
#滚动到“体育社区”
driver.execute_script("arguments[0].scrollIntoView();", target)
截图操作也很简单,使用driver.get_screenshot_as_file(path)即可完成截图,之后 可以借助PIL模块来进行各种处理。
11. 其他操作
还有其他一些操作如:上传下载文件、操作cookie、验证码的处理等等操作还没有用到过,这些用的场景较少并且有的还比较复杂,用到的时候再去学习就好了。
熟练使用以上的各部分,可以写出各种常用的脚本,我们算是入门Selenium了。:)
本文已收录于以下专栏:
相关文章推荐
很多没有语言基础小伙伴学了一点selenium,会写“打开浏览器-&输入搜索内容-&点击百度一下”这种简单用例后就不知道怎么进阶了,下面已一个实际的例子介绍selenium怎么一步步进阶
环境搭建安装...
Selenium 是一个用于Web应用程序测试的工具,支持浏览器有 ie、firefox、Safari、Google等。
学习selenium自动化具备知识点:
1,语言知识掌握方面:ja...
首先需要安装python 
进入命令行 输入python –version 查看python版本,没有没有安装的话,建议安装python3.x版本,从2.x到3.x改动很大,下载地址和安装方法百度一下...
一、自动化测试的概念及意义:
1.什么是自动化测试:
一般是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。
让测试更有效率...
Selenium 自动化测试浏览器,它主要是用于 Web 应用程序的自动化测试,但肯定不只局限于此,同
时支持所有基于 web 的管理任务自动化。准备工作python版本:2.7
IDE:Pych...
Page Object设计模式对一UI经常变动的自动化测试,可以采用Page Object 设计模式,Page Object 主要是对界面元素和基本操作进行封装,这样可以使测试用例更关注与业务而非界面...
http://blog.chinaunix.net/uid--id-3399138.html
 REPLC
 http://docs.mongodb.org/manual/tutori...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 find elements by id 的文章

 

随机推荐