我试图弄清楚如何打开一个有头浏览器来从在 Docker 容器中运行的 NestJs 应用程序内部执行一些任务。
\n申请代码:
\nimport { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\nimport { chromium } from "playwright";\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get()\n async getHello(): Promise<string> {\n const browser = await chromium.launch({ \n headless: false,\n env: {\n "DISPLAY": ":99"\n }\n });\n const context = await browser.newContext({ javaScriptEnabled: true });\n const page = await context.newPage();\n\n await page.goto("http://www.google.com");\n await page.waitForLoadState("load");\n\n return "Yay";\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nDockerfile:
\nFROM ubuntu:20.04 AS BUILD_IMAGE\n\n# INSTALL …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Playwright中做一些断言。我需要断言,在链接列表中,<a>所有链接都具有该属性href。但是,我不知道如何使用剧作家功能来实现这一点。
我的代码在这里:
test.only('then a list of 44 links is displayed', async({ page }) => {
const linkList = await page.locator('div#content > ul > li > a');
for(let i = 0; i < await linkList.count(); i++) {
expect(await linkList.nth(i)).toHaveAttribute('href', ''); }
await expect(linkList).toHaveCount(44);
})Run Code Online (Sandbox Code Playgroud)
toHaveAttribute()函数需要 2 到 3 个参数,因为它获取键属性和属性的值,但我只需要检查它是否具有 href 属性。
我怎样才能做到这一点?
这是正在测试的网站: https ://the-internet.herokuapp.com/
我想在 Playwright 中测试 Web 应用程序的元标记,但我在官方文档中没有找到任何信息。有人可以建议我进行元数据测试吗?
例如,我尝试测试:
<meta name="description" content="something">
test("Meta data", async ({ page }) => {
await page.goto(env.baseUrl)
const metaDescription = page.locator('meta [name="description"]')
await expect(metaDescription).toHaveText("something")
})
Run Code Online (Sandbox Code Playgroud)
结果是:
出了什么问题以及如何以正确的方式进行测试?
当您访问此链接时,该页面将运行一些 javascript,然后自动重定向到pdf。我很难从剧作家那里得到最终的网址。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://scnv.io/760y", wait_until="networkidle")
print(page.url)
page.close()
Run Code Online (Sandbox Code Playgroud)
有没有办法获得最终的网址?
npx playwright install chromiumTL;DR - 有谁知道安装 Node.js 依赖项后以及在 Google Cloud Function 的生产环境中运行的方法吗?
是否可以在部署的 Google Cloud Function 中运行 Playwright?我有一个已部署的函数,在本地运行良好,但在部署时,始终失败并出现以下错误:
browserType.launch: Executable doesn't exist at /root/.cache/ms-playwright/chromium-1015/chrome-linux/chrome
Run Code Online (Sandbox Code Playgroud)
有趣的是,在使用 Playwright 之前,我成功地使用 Puppeteer 成功部署了 Google Cloud Function。Puppeteer 也使用 Chromium,并且在定位和/或安装 Chromium 可执行文件方面没有任何问题(而且我也仅将 Chromium 与 Playwright 一起使用)。
我很确定运行npx playwright install chromium后npm install可以解决问题,但我不确定如何在 Google Cloud Function 的环境中运行该命令。我尝试执行以下操作:
// package.json
...
"scripts": {
...
"postinstall": "npx playwright install chromium",
"postci": "npx playwright install chromium"
}
...
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为我遇到了同样的错误(并且我不确定是否执行了后脚本)。不过,在本地运行npx playwright install chromium是有效的。
有人在部署的 Google …
我试图在 Quotes.toscrape.com/scroll 上运行滚动示例时运行 scrape-playwrights 文档上的示例,但由于反应器问题,我什至无法进行抓取:
URL SPIDER TEST
***********************
SCRAPE STARTED
***********************
2022-08-11 15:47:38 [scrapy.crawler] INFO: Overridden settings: {'TWISTED_REACTOR': 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'} crawled: <Deferred at 0x11ef17e50 current result: <twisted.python.failure.Failure builtins.Exception: The installed reactor (twisted.internet.selectreactor.SelectReactor) does not match the requested one (twisted.internet.asyncioreactor.AsyncioSelectorReactor)>>
Run Code Online (Sandbox Code Playgroud)
代码是:
import csv
import json
import pygsheets
import scrapy
from scrapy_playwright.page import PageMethod
import json
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
from scrapy.utils.reactor import install_reactor
from scrapy.crawler import CrawlerProcess
from scrapy.crawler import CrawlerRunner
import datetime as dt
from datetime …Run Code Online (Sandbox Code Playgroud) 我将一些剧作家测试从 js 中的 Visual Studio 代码移植到使用 xuint 的 Visual Studio C#。
我似乎无法让 Expect 命令在 Visual Studio 中工作。
在 javascript 项目中,我将执行以下操作来检查元素是否包含一些文本:
await expect(page.locator('elementtofind')).toContainText('myText');
Run Code Online (Sandbox Code Playgroud)
在 C# 中,如果我写同样的东西,我会在expect命令上得到“名称‘标识符’在当前上下文中不存在”错误
在 JS 项目中我的导入语句是
import { test, expect } from '@playwright/test';
Run Code Online (Sandbox Code Playgroud)
在 C# 项目中我使用:
using Microsoft.Playwright;
Run Code Online (Sandbox Code Playgroud)
其中似乎不包含期望
作为临时解决方法,我在 C# 中执行以下操作以获得相同的结果
var item1 = page.Locator("elementtofind");
Assert.Equal("myText", await item1.InnerTextAsync());
Run Code Online (Sandbox Code Playgroud)
但想在我的测试中使用预期功能。
有谁知道我如何在我的项目中实现这一点?
我正在使用 Playwright 测试一个登录表单,该表单具有以下两种可能的状态之一:
由于我们的身份验证系统的某些逻辑,完全确定性是不切实际的,因此我需要确保我的测试成功处理每种情况。
一种这样的解决方案是[1]:
if (await page.getByRole('button', { name: 'Sign In' }).count() > 0) {
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Sign In' }).click();
} else {
await page.getByLabel('First & last name').fill('Bob Alice');
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Save' }).click();
}
Run Code Online (Sandbox Code Playgroud)
但是,这需要页面等待我的超时才能继续。我可以减少条件检查的超时[2],但这会增加测试的脆弱性。
如何在不强制超时的情况下使用条件逻辑来确保执行 Playwright 中的两个代码路径之一?
我一直在尝试使用以下代码验证 GET 状态。不幸的是,我收到错误“apiRequestContext.get: connect ECONNREFUSED ::1:8080”。任何见解将不胜感激。
代码:
import { expect, test } from '@playwright/test';
test('Get health status', async ({ request }) => {
const response = await request.get('http://localhost:8080/myapp/actuator/health')
expect(response.status()).toBe(200)
})Run Code Online (Sandbox Code Playgroud)
错误: apiRequestContext.get:连接 ECONNREFUSED ::1:8080
我正在寻找一种方法,允许我在单击按钮或某些操作后等待网络空闲。有没有办法点击后等待网络空闲?
page.locator("text=Click").click() //some method that wait network is idle after clicking the button
我试过 waitForLoadState 仅在有导航时才有效。waitForResponse 适用于特定请求,但对我来说不好。
playwright ×10
javascript ×3
typescript ×2
c# ×1
chromium ×1
docker ×1
html ×1
linux ×1
meta-tags ×1
python ×1
scrapy ×1
testing ×1
x11 ×1
xserver ×1