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

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 测试相关
  • 时间:2017-11-23 08:56
  • 7948人已阅读
简介 本篇接着前面内容,主要学习driver如何在同一个浏览器的两个不同tab进行切换,然后如何判断我们创建的文章就是我们新建的。1.如何实现不同tab之间切换上一篇脚本我们点击了发布文章的link,结果会在新tab打开。这个就给我带来了一个新的问题,也就是selenium的一个API知识点的学习,也就是根据tab的ID或者叫句柄来进行switchTo的方法。原理就是,先获取当前句柄,保存下来,然后获取

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022


本篇接着前面内容,主要学习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


TopTop