我正在尝试使用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值是否正确。这些预期值存储在配置文件中。
我没有一个明确的答案来解释为什么你没有把“内部功能”放入控制台,因为在我这边稍微简化后,它确实起作用了。但是我有一些关于如何让它更清楚的建议,我会给你一个工作示例。
checkDeskTopMenuBartextLinks()
不应在标题中。(从技术上讲,这是可行的,但你很快就会迷失在这种结构中。)
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将重定向到未知应