标签: playwright

剧作家无法在 Ubuntu 上打开浏览器

我试图弄清楚如何打开一个有头浏览器来从在 Docker 容器中运行的 NestJs 应用程序内部执行一些任务。

\n

申请代码:

\n
import { 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}\n
Run Code Online (Sandbox Code Playgroud)\n

Dockerfile:

\n
FROM ubuntu:20.04 AS BUILD_IMAGE\n\n# INSTALL …
Run Code Online (Sandbox Code Playgroud)

linux x11 xserver docker playwright

5
推荐指数
0
解决办法
3933
查看次数

如何断言 HTML 元素是 Playwright 中的有效链接?

我正在尝试在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/

html javascript automated-tests playwright

5
推荐指数
1
解决办法
5747
查看次数

与剧作家一起测试元标签

我想在 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)

结果是:

  • 接收到的字符串是“”
  • 等待选择器'元[name =“description”]'

出了什么问题以及如何以正确的方式进行测试?

automated-tests meta-tags playwright

5
推荐指数
1
解决办法
2921
查看次数

如何使用 playwright 通过网络应用程序捕获重定向

当您访问此链接时,该页面将运行一些 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)

有没有办法获得最终的网址?

playwright playwright-python

5
推荐指数
1
解决办法
5903
查看次数

不存在用于在部署的 Google Cloud Function 中运行 Playwright 的 Chromium 可执行文件

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 chromiumnpm 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 …

chromium google-cloud-functions playwright

5
推荐指数
1
解决办法
1万
查看次数

安装的 Reactor 与请求的不匹配

我试图在 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)

python scrapy python-asyncio playwright

5
推荐指数
1
解决办法
1615
查看次数

如何使用 C# 在剧作家中使用“expect” - Xunit

我将一些剧作家测试从 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)

但想在我的测试中使用预期功能。

有谁知道我如何在我的项目中实现这一点?

c# playwright

5
推荐指数
1
解决办法
3452
查看次数

有条件地等待 Playwright 中的定位器

我正在使用 Playwright 测试一个登录表单,该表单具有以下两种可能的状态之一:

  1. 如果用户已经存在,它只会询问他们的密码并显示“登录”按钮。
  2. 如果是新用户,它将询问他们的“名字和姓氏”和密码,并显示“保存”按钮。

由于我们的身份验证系统的某些逻辑,完全确定性是不切实际的,因此我需要确保我的测试成功处理每种情况。

一种这样的解决方案是[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 中的两个代码路径之一?

javascript typescript playwright

5
推荐指数
1
解决办法
4081
查看次数

使用 Playwright 进行 API GET 请求测试

我一直在尝试使用以下代码验证 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

javascript testing typescript visual-studio-code playwright

5
推荐指数
1
解决办法
1835
查看次数

点击后等待网络空闲

我正在寻找一种方法,允许我在单击按钮或某些操作后等待网络空闲。有没有办法点击后等待网络空闲? page.locator("text=Click").click() //some method that wait network is idle after clicking the button

我试过 waitForLoadState 仅在有导航时才有效。waitForResponse 适用于特定请求,但对我来说不好。

playwright playwright-java

5
推荐指数
2
解决办法
1万
查看次数