当前位置: 首页 > 知识库问答 >
问题:

如何确定如何将网站导航文本/链接与配置进行比较

孔征
2023-03-14

我正在尝试使用TestCafe/JavaScript创建一个测试,该测试将网站的顶部菜单文本/链接与存储在配置中的预期数据进行比较。我有一些使用TestCafe的经验,但仍在学习。

当我设置函数并调用它时,我输入了函数,但没有输入其中的循环,正如FOR循环内部的console.log没有打印到控制台所证明的那样。我调试这个已经有一段时间了,但无法理解。

网址:https://wdwthemeparks.com

配置文件(位于项目中的./Config/default.json5)

    // Expected Desktop top menu links
    "top_menu_nav": {
        "All": "/all/",
        "News": "/news/",
        "Press Releases": "/press/",
        "Rumors": "/rumors/",
        "About": "/about/",
        "Contact": "/contact/",
        "Refurbishments": "/refurbishments/",
    },
}

选择器和相关函数(位于项目中的./page objects/header.js)

const config = require('../config/config.js');
import { Selector, t } from 'testcafe';

class Header {

    // Top Menu Selectors
    topMenu = Selector('.td-header-top-menu');
    topMenuPageLinksSection = Selector('.td-header-sp-top-menu');
    topMenuSocialIconsSection = Selector('.td-header-sp-top-widget');
    topMenuNavItem = Selector('.top-header-menu').child().find('a').withAttribute('href');


    // Logo
    headerLogo = Selector('.td-header-sp-logo');

    // Nav Menu
    mainNavMenu = Selector('#td-header-menu');

    /////////////////////////
    /////// Functions ///////
    /////////////////////////

    async checkDesktopTopMenuBarTextLinks() {
        console.log('Inside function');
        for (let navText in config.top_menu_nav ) {
            console.log('inside for loop');
            await t.expect(await this.topMenuNavItem.withText(navText).exists).ok(`"${navText}" top navigation menu do not exists.`);
            await t.expect(await this.topMenuNavItem.withText(navText).getAttribute('href')).contains(config.top_menu_nav[navText]);
            }
        }
}

export let header = new Header();

测试文件(位于项目中的./test/header.js;文件中的其他行由于想要测试函数而被注释掉)

const config = require('../config/config.js');
import { Selector, t, ClientFunction } from 'testcafe';
import { header } from '../page-objects/header';

/* TO DO
    1. Check Top Menu item names/links are valid
    2. Check Main Nav item names/links are valid
*/

const siteURL = 'https://wdwthemeparks.com/';  // Set the siteURL into a constant

fixture(`Desktop Header`)
    .page(`${siteURL}`)

test.meta({ desktop: 'true' })('Verify presence and functionaltiy of Header', async t => {

    await header.checkDesktopTopMenuBarTextLinks();

    // // Test the Top Menu area
    // await t
    //  .expect(header.topMenu.visible).ok('Top Menu is NOT visible')
    //  .expect(header.topMenuPageLinksSection.visible).ok('Top Menu Page Links are NOT visible')
    //  .expect(header.topMenuSocialIconsSection.visible).ok('Top Menu Social Icons are NOT visible');

    // // Verify Logo is visible and clicking goes to siteURL
    // await t.expect(header.headerLogo.visible).ok('Logo is NOT visible');
    // await t.click(header.headerLogo)
    // const getLocation = ClientFunction(() => document.location.href);  // Get the URL of the page and set to constant
    // await t.expect(getLocation()).contains(`${siteURL}`);

    // // Verify Main Menu
    // await t.expect(header.mainNavMenu.visible).ok('Main Nav menu is NOT visible');
});

因此,我想再次测试前端是否显示文本,以及顶部菜单中每个项目的href值是否正确。这些预期值存储在配置文件中。

共有1个答案

夏侯衡
2023-03-14

我没有一个明确的答案来解释为什么你没有把“内部功能”放入控制台,因为在我这边稍微简化后,它确实起作用了。但是我有一些关于如何让它更清楚的建议,我会给你一个工作示例。

  1. 页面对象不应该包含任何“检查”逻辑,这应该在测试中,因为,这就是测试的全部内容。因此,checkDeskTopMenuBartextLinks()不应在标题中。(从技术上讲,这是可行的,但你很快就会迷失在这种结构中。)
  2. wait t.expect(wait this.topMenuNavItem.withText(navText.exists)=

话虽如此,我简化了您尝试做的示例:

Resources/config.json

{
    "top_menu_nav": {
        "All": "/all/",
        "News": "/news/",
        "Press Releases": "/press/",
        "Rumors": "/rumors/",
        "About": "/about/",
        "Contact": "/contact/",
        "Refurbishments": "/refurbishments/"
    }
}

Objects/header.js

import { Selector, t } from 'testcafe';

class Header {

    constructor() {
        this.topMenuNavItem = Selector('.top-header-menu').find('a');
    }
}

export default new Header();

Tests/menu.js

import { Selector } from 'testcafe';
import config from '../config';
import Header from '../Objects/header';

const testData = require('../Resources/config.json');

fixture `Check Menu`    
    .page('https://wdwthemeparks.com/');    

test      
    ('Check Menu Items', async t => {       

        for (let navText in testData.top_menu_nav) {
            await t.expect(Header.topMenuNavItem.withText(navText).exists).ok();          
        }        
});

执行此操作时,测试将成功运行:

可能的进一步改进:

  • 命名约定:我可能会将config.json重命名为其他名称。在我看来,它不是一个真正的配置文件,因为它包含用于检查的值。
  • 我将遵循官方文档中提到的页面对象结构。
  • .page('s)中,我会使用一个变量而不是硬编码的URLhttps://wdwthemeparks.com/'); 。此URL可以进入真实的配置文件。
  • 我会让测试尽可能简单和小。这意味着在一个测试中检查菜单项的名称,在另一个测试中检查href属性。在本例中,这可能不是什么大问题,但在更复杂的示例中,您会喜欢使用清晰的小测试来帮助您了解问题所在

 类似资料:
  • 我正在尝试将应用程序深入链接到我的网站,但我不知道如何让它进入计算机上的常规旧Instagram,然后再进入Android或iOS设备上的应用程序。我知道这些链接有效,因为我单独尝试过。

  • 因此,我有一个引导导航栏,我以前一直在选择带有“导航文本”span类的链接。这适用于字体大小和颜色,但当我尝试应用边距或填充时,我无法得到响应。我已经尝试过用很多不同的方式来选择定位的链接,所以我转到这里。 以下是html: 那么,我将如何给出正确的答案呢。导航文本链接是否正确定位?我成功地给了#view id链接一个空白。但是上面的填充物也不起作用? 这里是整个导航栏,如果你需要它(引导) 不停

  • 了解 Dreamweaver 中的链接和导航功能,以及绝对路径、文档相对路径和站点根目录相对路径。 在设置 Dreamweaver 站点以存储网站文档和创建 HTML 页面之后,您将需要创建文档之间的连接。 Dreamweaver 提供多种创建链接的方法,可创建指向文档、图像、多媒体文件或可下载软件的链接。可以建立到文档内任意位置的任何文本或图像的链接,包括标题、列表、表、绝对定位的元素(AP 元

  • 我的应用程序中有一个用例,它应该防止用户在重置密码时选择最后3个密码中的一个。我使用Angular作为前端,spring boot作为后端。在我的场景中,用户密码存储为bcrypt哈希。 如何将用户输入的密码与最近3个存储的bcrypt密码进行比较? 当我运行下面的代码片段示例时, 它生成以下bcrypt哈希。每个散列都是不同的,这是合理的,因为当我检查时,我可以看到生成的salt是随机值。 sp

  • 你好!我正在用java中的swing包创建一个简单的登录表单,在检查用户名和密码是否正确时遇到了问题。 以下是当前的代码: } 这个想法是在密码和用户名文件中存储多个帐户。例如,文件内容是: Username.txt: 暗语txt: 如果用户名文件的第1行是“sampleUsername1”,那么它的密码也来自密码文件的第1行“samplePassword1”。如果用户和密码不在同一行或不在文件中

  • 我试图在Heroku上建立一个网络应用程序。DNS路由通过AWS Route53完成,分发通过CloudFront完成。比方说,我已经为www.example.com购买了自己的SSL证书。 除了我想能够使用子域,然后在Heroku中显示一个不同的应用程序之外,这一切都正常。这也适用于本地。然而,如果我在CloudFront中将主机标头列入白名单,以便我可以执行此路由,Heroku将重定向到未知应