reactjs - 将 jest-dom 匹配器与 puppeteer 对象一起使用
问题描述
我正在使用 puppeteer 和 jest 为 React 应用程序编写端到端测试。
我通过 import 扩展了期望匹配器,当我尝试在 puppeteer 的对象上使用其中一个导入的匹配器时@testing-library/jest-dom/extend-expect
遇到错误。received value must be an HTMLElement or an SVGElement
let bg = await page.waitForSelector('#bg'); // puppeteer
expect(bg).toBeVisible(); // jest
received value must be an HTMLElement or an SVGElement.
Received has type: object
Received has value: {"_client": {"_callbacks": [Map], "_connection": [Connection], "_sessionId": "B2257B3009305E280640F675C248F61E", "_targetType": "page", "emitter": [Object], "eventsMap": [Map]}, "_context": {"_client": [CDPSession], "_contextId": 3, "_world": [DOMWorld]}, "_disposed": false, "_frameManager": {"_client": [CDPSession], "_contextIdToContext": [Map], "_frames": [Map], "_isolatedWorlds": [Set], "_mainFrame": [Frame], "_networkManager": [NetworkManager], "_page": [Page], "_timeoutSettings": [TimeoutSettings], "emitter": [Object], "eventsMap": [Map]}, "_page": {"_accessibility": [Accessibility], "_client": [CDPSession], "_closed": false, "_coverage": [Coverage], "_emulationManager": [EmulationManager], "_fileChooserInterceptors": [Set], "_frameManager": [FrameManager], "_javascriptEnabled": true, "_keyboard": [Keyboard], "_mouse": [Mouse], "_pageBindings": [Map], "_screenshotTaskQueue": [ScreenshotTaskQueue], "_target": [Target], "_timeoutSettings": [TimeoutSettings], "_touchscreen": [Touchscreen], "_tracing": [Tracing], "_viewport": [Object], "_workers": [Map], "emitter": [Object], "eventsMap": [Map]}, "_remoteObject": {"className": "HTMLCanvasElement", "description": "canvas#bg", "objectId": "{\"injectedScriptId\":3,\"id\":3}", "subtype": "node", "type": "object"}}
我还没有在文档中找到如何使用它(使用 puppeteer)。你知道正确的用法吗?
jest-dom v 4.2.4
puppeteer v 4.0.1
解决方案
您确实需要page.waitForSelector
等待元素被呈现,但您可以将元素分配给一个变量page.$
(它document.querySelector
在页面内运行),如下所示:
await page.waitForSelector('#bg'); // puppeteer
const bg = await page.$('#bg');
但正如其他人所建议的那样:它不能与@testing-library/jest-dom/extend-expect
.
使用 puppeteer,您可以像这样检查可见性:
test('should check if element is visible', async function() {
const isVisible = await page.evaluate(() => {
const el = document.querySelector('my-selector');
if (!el)
return false;
const style = window.getComputedStyle(el);
return style && style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';
});
expect(isVisible).toBe(true);
})
推荐阅读
- spring-boot - Springboot 无法使用 springboot 2.0.3 获取连接(用户名,密码),但在 1.5.3 中工作正常
- html - 检查的 HTML 单选取决于点击的来源
- react-native - JS 根视图在从其父视图中删除后是否总是会接收来自本机的事件?
- entity-framework - asp.net core ef order by 在声明后不起作用
- python - 将对象保存到数据库时出现问题,因为模型包含 jsonfield sqlite3 django
- c++ - C++ STL:向量语法
- node.js - 从 Lambda 创建一个带有 HTML 文件的存储桶(想要 HTML,获取 Octet Stream)
- c - 相同值的指针比较不相等
- html - how to make two columns with different background and left right spacing in bootstrap
- mapbox-gl-js - Where can I view older Mapbox GL JS API documentation?