如何让我的 Selenium 测试不那么脆弱?

2024-01-22

我们使用 Selenium 来测试 ASP.NET 应用程序的 UI 层。许多测试用例测试跨越多个页面的较长流程。

我发现测试非常脆弱,不仅因为实际更改页面的代码更改而被破坏,而且还因为无害的重构而被破坏,例如重命名控件(因为我需要将控件的 clientID 传递给 Selenium 的 Click 方法等)或替换带有中继器的网格视图。结果,我发现自己“浪费”时间更新测试用例中的字符串值以修复损坏的测试。

有没有办法编写更易于维护的 Selenium 测试?或者更好的 Web UI 测试工具?

编辑添加:通常,初稿是通过在 IDE 中记录测试来创建的。 (第一步可能由 QA 人员执行。)然后我重构生成的 C# 代码(提取常量、提取重复代码的方法、可能使用不同的数据重复测试用例等)。但是每个测试用例的一般代码流程仍然相当接近最初生成的代码。


我发现 PageObject 模式非常有用。

http://code.google.com/p/webdriver/wiki/PageObjects http://code.google.com/p/webdriver/wiki/PageObjects

更多信息: -硒有什么意义? https://stackoverflow.com/questions/616810/whats-the-point-of-selenium/616887 - 硒批判 https://stackoverflow.com/questions/99876/selenium-critique/211452

也许一个好的开始方法是逐步重构您的测试用例。

我使用与你有selenium + c#相同的场景

我的代码如下所示:

测试方法看起来像这样

    [TestMethod]
    public void RegisterSpecialist(UserInfo usrInfo, CompanyInfo companyInfo)
    {
        var RegistrationPage = new PublicRegistrationPage(selenium)
              .FillUserInfo(usrInfo)
              .ContinueSecondStep();
        RegistrationPage.FillCompanyInfo(companyInfo).ContinueLastStep();
        RegistrationPage.FillSecurityInformation(usrInfo).ContinueFinishLastStep();
        Assert.IsTrue(RegistrationPage.VerifySpecialistRegistrationMessagePayPal());
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        paypal.LoginSandboxPage(usrInfo.sandboxaccount, usrInfo.sandboxpwd);
        Assert.IsTrue(paypal.VerifyAmount(usrInfo));
        paypal.SubmitPayment();
        RegistrationPage.GetSpecialistInformation(usrInfo);
        var bphome = new BPHomePage(selenium, string.Format(Resources.GlobalResources.LoginBPHomePage, usrInfo.AccountName, usrInfo.Password));
        Assert.IsTrue(bphome.VerifyPageWasLoaded(usrInfo));
        Assert.IsTrue(bphome.VerifySpecialistProfile());
        bphome.Logout();
    }

页面对象将是这样的

public class PublicRegistrationPage
{
    public ISelenium selenium { get; set; }

    #region Constructors
    public PublicRegistrationPage(ISelenium sel)
    {
        selenium = sel;
        selenium.Open(Resources.GlobalResources.PublicRegisterURL);
    }
    #endregion
    #region Methods

    public PublicRegistrationPage FillUserInfo(UserInfo usr)
    {
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserFirstName", usr.FirstName);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserLastName", usr.LastName);
        selenium.Select("ctl00_cphComponent_ctlContent_wizRegister_ddlUserCountry", string.Format("label={0}",usr.Country ));
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserEmail", usr.Email );
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserDirectTel", usr.DirectTel);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserMobile", usr.Mobile);
        return this;
    }

}

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让我的 Selenium 测试不那么脆弱? 的相关文章

随机推荐

  • 亚马逊 S3 CORS 错误

    当我的应用程序通过 amazon S3 上的 Javascript 请求文件时 我收到了权限被拒绝的错误 我设置了一个 CORS 文件 它似乎在大多数情况下都可以工作 但会间歇性地失败 我总是可以通过清除浏览器缓存来解决这个问题 关于这可能
  • 将 DataFrame 保存为 cvs 时 Spark 2.0 DataSourceRegister 配置错误

    我正在尝试将数据帧保存到 Spark 2 0 Scala 2 11 中的 cvs 从 Spark 1 6 迁移代码的过程 sparkSession sql SELECT FROM myTable coalesce 1 write forma
  • 为什么转置 512x512 矩阵比转置 513x513 矩阵慢得多?

    在对不同大小的方阵进行一些实验后 出现了一个模式 总是 转置大小矩阵2 n比转置某一尺寸慢2 n 1 对于较小的值n 差别并不大 然而 超过 512 的值就会出现很大的差异 至少对我来说 免责声明 我知道由于元素的双重交换 该函数实际上并未
  • 如何通过“外键”关系组合json对象

    我有从两个不同的休息资源返回的两个对象 id 1 username jdoe role id 1 role developer members 1 3 5 我想使用普通的 ole javascript 将这两个对象组合成一个 id 位于成员
  • 是否可以从外部 ExtendScript 执行 JSX 脚本?

    通常 当您编写 jsx 脚本来自动化 Adob e 产品 如 InDesign Illustrator 或 Photoshop 时 您可以从 ExtendScript IDE 编写 调试和执行脚本 是否可以绕过 ExtendScript 并
  • 更新 cloud firestore 文档中的单个地图

    最终更新我从使用基于 andresmijares 的以下答案的事务更改为使用 set 现在我可以将数据写入数据库 var gradeDocRef db collection students doc studentId console lo
  • 数组的 [..] 和 [...] 之间没有区别吗?

    Edit 做了一个 github 问题 https github com jashkenas coffee script issues 3452 issuecomment 40976448 一天后它就被 jashkenas 关闭了 因此 要
  • 如何在 iPhone 的 webview 中打开字符串中的 url

    我只想从我的字符串中打开一个网址 我的字符串已经有我只想显示的网址UIWebView myString http maps google com maps zoom 8 sensor false lci transit layer traf
  • 显示另一个 UIWindow 时出现问题

    我正在编写一个 iPad 应用程序 并且正在尝试显示第二个应用程序UIWindow在我的应用程序的主窗口顶部 我想做的主要事情是创建一个登录窗口 如何使用 UISplitViewController 呈现登录 https stackover
  • 开发者可以通过 WatchKit 获取心率原始数据吗?

    是否可以使用 Apple WatchKit 以及用于心跳 心率数据访问 原始数据访问的 API 来开发第三方应用程序 WatchKit SDK 现在对开发者公开可用吗 心率原始数据信息是现在可用 in Watchkit for watchO
  • 从二进制文件中提取对象并放入 List

    我以前做过这个 但不知道我是怎么做到的 我有一个二进制文件 我想在其中存储对象 我已经序列化了对象类 Serializable 并已成功将各个对象保存到文件中 然而 当尝试读取对象并放入其中时 问题开始出现 List lt gt 以便进一步
  • Wordpress 与 Haml/Sass

    使用过Haml http haml lang com and Sass http sass lang com 对于一些 Rails 副项目 我发现它们极大地加快了我的前端开发速度 然而 我还没有找到像 Wordpress 这样强大或客户熟悉
  • PHP 是面向对象的吗?

    PHP 是面向对象的语言吗 如果没有 那么 CakePHP 框架怎么样 它是 PHP 的面向对象 MVC 实现吗 另外 PHP 应用程序可以完全使用classes叫做面向对象 不 PHP 不是完全面向对象的语言 C 或 Java 也不是 因
  • Python插入变量字符串作为文件名

    我试图在每次脚本运行时创建一个具有唯一文件名的文件 我只想每周或每月这样做 所以我选择使用日期作为文件名 f open s csv wb name 这是我收到此错误的地方 Traceback most recent call last Fi
  • Cocos2D 中的评分系统

    我的游戏有碰撞检测功能 当我的导弹击中敌人时 敌人就会消失 我想添加一个评分系统 每次我的导弹击中敌人时都会增加 1 分 我将在下面发布我的游戏代码 我使用了HelloWorldLayer m 这是代码 Link http pastebin
  • sed 就地标志适用于 Mac (BSD) 和 Linux

    是否有调用sedtodo 无需备份即可在 Linux 和 Mac 上进行就地编辑 虽然 BSDsedOS X 附带的似乎需要sed i GNUsedLinux 发行版通常将引号解释为空输入文件名 而不是备份扩展名 并且需要sed i 反而
  • 如何在Racket中使用TCP?

    我试图从客户端向服务器发送消息 并在服务器上打印该消息 服务器 rkt lang racket define the listener tcp listen 9876 define values in out tcp accept the
  • 检测/解析文本中的邮寄地址

    是否有任何开源 商业库可以检测文本中的邮寄地址 就像 Apple 的邮件应用程序在 Mac iPhone 上为地址添加下划线一样 我一直在网上做一些研究 想法似乎是使用 Google Regex 或完整的 NLP 软件包 例如斯坦福大学的
  • JS改变元素的颜色Onclick未定义的颜色

    我想制作一个颜色更改器按钮 但最后一次单击后 颜色将设置为未定义 知道如何删除它吗 var color Orange Red Green Blue var i 0 document querySelector changeColorBtn
  • 如何让我的 Selenium 测试不那么脆弱?

    我们使用 Selenium 来测试 ASP NET 应用程序的 UI 层 许多测试用例测试跨越多个页面的较长流程 我发现测试非常脆弱 不仅因为实际更改页面的代码更改而被破坏 而且还因为无害的重构而被破坏 例如重命名控件 因为我需要将控件的