注:问题中答案是根据自身学习经验,及网上大神答案进行相关总结得出,较为粗浅,如有什么遗漏或不正确的地方,还请指出,闲下来就总结一下。持续更新中。
Q1.selenium中如何判断元素是否存在?
之前selenium中的WebDriver中一个方法:isElementPresent()。作用即是判断该元素是否存在。
但现在selenium中,如果需要判断元素是否存在,则需要封装一个try-catch方法进行判断
public boolean isElementPresent(By by){
try{
driver.findElement(by);
return true;
}catch(Exception e){
return false;
}
}
接着直接调用该方法就可以了,比如:
assertEquals(isElementPresent(By.id("login"));
Q2:selenium中hidden或者是display = none的元素是否可以定位到?
隐藏元素或不可见元素,通常被运用在下拉菜单栏当中,鼠标移至(或点击)某一个菜单块,下拉列表才会显示出来,然后再进行定位,即可以成功。(这里部分元素是用xpath进行定位,但实际情况中使用ID、Name等不变属性进行定位较好)
如下代码展示:
driver.findElement(By.xpath("//*[@id='sidebar-collapse']/i")).click();//点击打开菜单栏
driver.findElement(By.xpath("//*[@id='sidebar']/div[1]/ul/li[2]/a")).click();//点击菜单块
Thread.sleep(1000);
driver.findElement(By.linkText("待办案件")).click();//点击待办中心
Actions enterPress=new Actions(driver);
WebElement searchbox=driver.findElement(By.className("search-text" ));//找到搜索框
WebElement searchButton=driver.findElement(By.xpath("//*[@id='main-container']/div[2]/div/div/button"));//找到搜索按钮
searchbox.sendKeys("f");//输入数据
enterPress.moveToElement(searchButton);
enterPress.click().perform();//点击搜索按钮
Q3:selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
操作元素的成功率即是通过定位元素的成功率来确定的。定位元素有很多种方法,比如:ID、Name、ClassName等等,如果程序员没有养成写代码的规范型,缺少这些值,那么定位元素的准确性则会大打折扣。一般来说,规范的代码元素的属性需要具备ID、Name等值,并且值唯一。这样使用这些属性值进行定位,就算程序员后续会修改代码,也不会影响你的测试代码的可执行性。
脚本执行的速度会受多方面的影响。比如:电脑配置、网速、脚本执行步骤繁琐程度、在运行中设置的等待时间、运行脚本的线程数。
通常,脚本执行步骤的繁琐程度可以通过使用面向对象的思想,添加相关框架结构,从而减少代码的重复率。比如:可以通过将用户名及密码写入缓存,从而减少登陆操作重新读入数据的工作量。
执行某一页面的速度过长,可以设置等待速度。如果加载的内容不会影响测试,可以中断加载。
这个问题应该先找出不稳定情况的根因,然后再来分析具体的解决办法。
出现不稳的情况大致分为三类:
1.网速原因。如果访问一个网页,加载得很缓慢。但selenium脚本运行时如果某个元素未加载出来,可能就会导致脚本运行失败。这个时候如果在元素加载时设置等待时间,就可以避免这个问题。但等待时间+运行时间,则会大大减低执行效率。
2.selenium版本问题。selenium1.0和selenium2.0使用还是有很大的区别。selenium2.0使用selenium1.0中的部分函数,就会有时有效,有时无效,比如:mouseover()函数,所以尽量避免
3.多线程时(执行时无先后顺序),用例之间有相互关联的情况,即耦合性较高。如:用例A执行了后,用例B会有所影响。但反过来就不会。这个时候就应该降低用例之间的关联度,尽量避免这种情况。
Q6:你的自动化用例的执行策略是什么?
一般会根据测试需求把自动化用例执行策略分为三种。
1.定时执行。当测试用例是用于监控的时候。在jenkis建立一个定时任务,到时间执行就好。
2.触发式执行。一般用于必须回归的测试用例。比如公司项目上,无论更改任何模块,都需要回归测试的测试用例。在jenkins上将我们的自动化测试任务绑定到开发的build任务上。当开发人员在测试环境上更新代码的时候,我们的自动化测试用例就会被触发执行。
3.手动执行。一般用于不经常执行的测试用例,执行花费时间太多。比如:全量测试用例(覆盖项目上所有的测试用例)。所以这类测试用例我们就采用人工执行,在jenkins创建一个任务,需要执行的时候人工去构建即可。
Q7:什么是持续集成?
持续集成是指开发阶段,对项目进行持续性自动化编译、测试,以达到控制代码质量的手段。持续集成是一种软件开发实践。
通俗来讲,就是当在开发阶段时,多个程序员每天都在不断的修改代码,测试需要获取新的程序进行测试。这个时候就需要集成的存在,把他们更新的代码获取到主干上。
通过自动化构建来进行集成,检查集成时发生的错误,需要100%正确,才能集成成功。这可以避免程序员手动集成带来大量的问题。并且如果发现这个版本带来了不可避免的Bug,可以通过集成工具进行回退。
Q8:自动化测试的时候是不是需要连接数据库做数据校验?
Q9:id,name,clas,x path, css selector这些属性,你最偏爱哪一种,为什么?
Q10:如何去定位页面上动态加载的元素?
Q11:如何去定位属性动态变化的元素?
Q12:点击链接以后,selenium是否会自动等待该页面加载完毕?
Q13:webdriver client的原理是什么?
Q14:webdriver的协议是什么?
Q15:启动浏览器的时候用到的是哪个webdriver协议?
Q16:什么是page object设计模式?
Q17:什么是page factory设计模式?
Q18:怎样去选择一个下拉框中的value=xx的option?
Q19:如何在定位元素后高亮元素(以调试为目的)?
Q20:什么是断言?
Q21:如果你进行自动化测试方案的选型,你会选择哪种语言,java,js,python还是ruby?
Q22:page object设置模式中,是否需要在page里定位的方法中加上断言?
Q23:page object设计模式中,如何实现页面的跳转?
Q24:自动化测试用例从哪里来?
Q25:你觉得自动化测试最大的缺陷是什么?
Q26:什么是分层测试?
Q27:webdriver可以用来做接口测试吗?
Q8:自动化测试的时候是不是需要连接数据库做数据校验?
Q9:id,name,clas,x path, css selector这些属性,你最偏爱哪一种,为什么?
Q10:如何去定位页面上动态加载的元素?
Q11:如何去定位属性动态变化的元素?
Q12:点击链接以后,selenium是否会自动等待该页面加载完毕?
Q13:webdriver client的原理是什么?
Q14:webdriver的协议是什么?
Q15:启动浏览器的时候用到的是哪个webdriver协议?
Q16:什么是page object设计模式?
Q17:什么是page factory设计模式?
Q18:怎样去选择一个下拉框中的value=xx的option?
Q19:如何在定位元素后高亮元素(以调试为目的)?
Q20:什么是断言?
Q21:如果你进行自动化测试方案的选型,你会选择哪种语言,java,js,python还是ruby?
Q22:page object设置模式中,是否需要在page里定位的方法中加上断言?
Q23:page object设计模式中,如何实现页面的跳转?
Q24:自动化测试用例从哪里来?
Q25:你觉得自动化测试最大的缺陷是什么?
Q26:什么是分层测试?
Q27:webdriver可以用来做接口测试吗?