专栏首页凯哥JavaSelenium+TestNG实战-7 多个tab之间driver的切换

Selenium+TestNG实战-7 多个tab之间driver的切换

本篇接着前面内容,主要学习driver如何在同一个浏览器的两个不同tab进行切换,然后如何判断我们创建的文章就是我们新建的。

1. 如何实现不同tab之间切换

上一篇脚本我们点击了发布文章的link,结果会在新tab打开。这个就给我带来了一个新的问题,也就是selenium的一个API知识点的学习,也就是根据tab的ID或者叫句柄来进行switchTo的方法。原理就是,先获取当前句柄,保存下来,然后获取全部tab的句柄,这个是一个集合,我们利用遍历的方法去判断,如果遍历的句柄和当前句柄相等,那么就执行什么操作。这个操作,常见就是关闭当前句柄对应tab页面,然后切换到新的tab,这样driver就停留在一个tab,直接在这个tab进行元素查找和操作。还有另外一个情况,两个tab都不进行关闭,driver在两个tab之前来回取值去判断。个人认为,第二种方法比较啰嗦,建议关闭当前句柄页面,切换到新页面。在BasePage.java中封装的这个切换方法代码如下

public void switchWindow(){

String currentWindow = driver.getWindowHandle();// 获取当前窗口句柄  

Set<String> handles = driver.getWindowHandles();// 获取所有窗口句柄

Logger.Output(LogType.LogTypeName.INFO, "当前窗口数量: "+ handles.size());

Iterator<String> it = handles.iterator();

while (it.hasNext()) {

if (currentWindow == it.next()) {

continue;

}try {

driver.close();

WebDriver window = driver.switchTo().window(it.next());// 切换到新窗口

Logger.Output(LogType.LogTypeName.INFO, "new page title is "+ window.getTitle());

} catch (Exception e) {

Logger.Output(LogType.LogTypeName.ERROR,"法切换到新打开窗口"+ e.getMessage());              

}

//driver.close();//关闭当前焦点所在的窗口

}

// driver.switchTo().window(currentWindow);//回到原来页面

2. 如何断言文章创建成功

如何断言,一直说断言是最难写的。这里最简单的断言就是,打开文章详情页,判断当前标题是我们之前输入过的标题就可以。这里我们暂时不考虑,两个文章标题完全一致的情况。即使完全一致,我们就可以到文章正文部分去找一个关键字来区分就可以。同样,放在任何一个测试自动化断言中,使用最多的也就是判断是否相同或者相等,判断是否包含关系,判断是否什么开头或者什么结尾。

千万不要去想实现,判断整篇文章和自己输入的都完全一样,这个selenium是无法做到,同样道理,人工也无法做到。因为,文章有时候带了段落格式,字体等信息。除非你两篇文章分别存在数据库,然后两个数据库数据进行对比,这个是没有意义的。因为,多一个少一个空格就能让你断言失败。

所以,自动化测试,断言不能写得太死了。否则这个自动化用例是没有意义,写的太死,意味经常运行失败。很多时候,我们都断言大致功能实现了就可以。

我们在article包下新建一个ArticleDetailsPage.java

package pageobjects.article;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;

import myframework.BasePage;

public class ArticleDetailsPage extends BasePage {

public ArticleDetailsPage(WebDriver driver) {

super(driver);

}

// 文章详情页 页面标题,不能用这个xpath .//*[@id='post-1']/header/h1,因为post-1这个1随时会变化

private @FindBy (xpath="//*/h1[@class='entry-title']")

WebElement ArticleDetails_title;

// 获取详情页文章标题方法

public String getArticleTitle() {

return ArticleDetails_title.getText();

}

}

主要就是定位文章详情页文章标题这个元素位置以及根据这个元素得到文章标题的text,在Selenium中,一般元素都是通过.getText()方法来得到这个元素节点的text属性。

接着上面一篇的测试用例脚本,我们加上文章开始的switchto方法来实现这个断言。

package testsuites.article;

import java.io.IOException;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.PageFactory;

import org.testng.Assert;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;

import pageobjects.Login;

import pageobjects.MenuNavigation;

import pageobjects.article.ArticleDetailsPage;

import pageobjects.article.writeacticle.NewArticle;

public class NewArticleTest {

public WebDriver driver;

@BeforeClass

public void setUp() {

try {

Login.initSetup();

} catch (IOException e) {

e.printStackTrace();

}

Login.loginValid();

driver = Login.driver;

}

@Test

public void testNewArticle() {

//初始化导航菜单页面

MenuNavigation mn = PageFactory.initElements(driver, MenuNavigation.class);

mn.clickArticle();

mn.clickNewArticle();

//初始化写文章页面

NewArticle na = PageFactory.initElements(driver, NewArticle.class);

String title = "我的第一篇自动化发布的文章";

String bodyContent = "第一行,这篇是演示如何通过自动化脚本来发布一篇文章。";

na.publishArticle(title, bodyContent);

// 点击链接跳转到该文章

na.clickArticleLink();

// driver切换到新窗口页面

na.switchWindow();

// 文章详情页

ArticleDetailsPage adp = PageFactory.initElements(driver, ArticleDetailsPage.class );

// 判断标题是不是前面输入的 title字段

Assert.assertEquals(adp.getArticleTitle(), title);

}

}

这里就提一下Assert.assertEquals(adp.getArticleTitle(), title); 这个TestNG提供的断言方法,主要是判断两个对象是否相等,第一个参数是实际结果,第二个参数是期望结果。

附上项目结构图

附上源码文件

https://pan.baidu.com/s/1dFpkRWP

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Selenium+TestNG实战-6 自动化实现发一篇文章

    前面我们实现了基本框架的搭建过程,把第一条自动化登录的脚本进行了业务Action和测试脚本进行分层或者分离,使用了POM思想去构造首页,测试类利用工厂类进行元素...

    凯哥Java
  • Selenium+TestNG实战-2 第一个Selenium脚本之登录

    前一篇,我们准备了好wordPress本地环境和eclipse编写脚本环境,这篇,我们新建一个Java main方法,不管什么技巧,框架,什么数据分离,完全是根...

    凯哥Java
  • Java任务调度框架之分布式调度框架XXL-Job介绍

    Java开发中经常会使用到定时任务:比如每月1号凌晨生成上个月的账单、比如每天凌晨1点对上一天的数据进行对账操作,在比如每天凌晨5点给180天未登陆过的用户发送...

    凯哥Java
  • java架构之路-(netty专题)netty的编解码(出入战)与粘包拆包

      上次博客我们主要说了netty的基本使用,都是一些固定的模式去写的,我们只需要关注我们的拦截器怎么去写就可以了,然后我们用我们的基础示例,改造了一个简单的聊...

    小菜的不能再菜
  • Netty案例介绍-群聊案例实现

      前面介绍了基于Netty的Http服务,本文我们来通过Netty来实现群聊案例。

    用户4919348
  • Netty第一个入门实例-TCP服务

    好了netty的第一个入门案例就到此了,具体的代码解释请多看代码中的注释,有不清楚的欢迎留言交流 O(∩_∩)O哈哈~

    用户4919348
  • 【Vue原理】Vue源码阅读总结大会 - 终

    终于啊终于啊,把 Vue 系列的文章发完了了,如释重负的感jio啊,今天就打算总结下,我这段时间来的历程和收获,本文纯吹水,没有技术含量,各位客官权当娱乐消遣也...

    神仙朱
  • 《快学 Go 语言》第 3 课 —— 分支与循环

    上面这个等式每一个初学编程的同学都从老师那里听说过。它并不是什么严格的数据公式,它只是对一般程序的简单认知。数据结构是内存数据关系的静态表示,算法是数据结构从一...

    老钱
  • 如何学习一个框架

    昨天我在一个群里有一个人在问,谁会 rxjs?我当时其实还有点好奇,对于 rxjs 我一直觉得很难,前阵子我也一直在研究。

    桃翁

扫码关注云+社区

领取腾讯云代金券