标签: playwright

如何添加剧作家的等待时间

我正在将 scrapy 与 playwright 集成,但发现自己在单击后添加计时器时遇到困难。因此,当我点击后截取页面的屏幕截图时,它仍然挂在登录页面上。

如何集成计时器以便页面等待几秒钟直到页面加载?

选择器

  • .onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.onetrust-lg.ot-close-icon下面替换为
  • .onetrust-close-btn-handler
import scrapy
from scrapy_playwright.page import PageCoroutine

class DoorSpider(scrapy.Spider):
    name = 'door'
    start_urls = ['https://nextdoor.co.uk/login/']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url=url, 
                callback = self.parse, 
                meta= dict(
                        playwright = True,
                        playwright_include_page = True,
                        playwright_page_coroutines = [
                        PageCoroutine("click", 
                           selector = ".onetrust-close-btn-handler"),
                        PageCoroutine("fill", "#id_email", 'my_email'),
                        PageCoroutine("fill", "#id_password",
                                                   'my_password'),
                        PageCoroutine('waitForNavigation'),
                        PageCoroutine("click", selector="#signin_button"),
                        PageCoroutine("screenshot", path="cookies.png", 
                                                    full_page=True),                        
                        ]
                )
            )

    def parse(self, response):
        yield {
            'data':response.body
        }

Run Code Online (Sandbox Code Playgroud)

scrapy playwright playwright-python

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

试图点击剧作家上的按钮

<input id="k" type="submit" class="btn btn_search" value="Search">
Run Code Online (Sandbox Code Playgroud)

尝试过

await page.click('button:has-text("SEARCH")');
await page.click('button:has-text("Search")');
await page.click('button.btn.btn_search');
await page.click('button:btn.btn_search'); <-- not valid selector
await page.click('button#k');
await page.click('BUTTON[type="submit"]');
Run Code Online (Sandbox Code Playgroud)

全部都以超时结束(除非另有说明)

例如 page.click:超时超过 30000 毫秒。=========================== 日志 ====================== ===== 等待选择器“button#k”

playwright

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

如何在没有上下文管理器的情况下在“with”之外启动剧作家

我正在创建一个网络自动化,我需要保持浏览器打开,但由于剧作家库只开始显示代码,包括每次脚本完成时浏览器自行关闭的“with”语句。我知道我可以用时间(100)快速解决这个问题,但这似乎不是最佳实践。我尝试创建类似的操作,但不使用 with 语句,但它不断关闭浏览器。如何解决此问题并保持浏览器打开?

请参阅下面我的代码:

from playwright.sync_api import sync_playwright

p = sync_playwright().start()
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.google.com/')
p.stop()
Run Code Online (Sandbox Code Playgroud)

python playwright playwright-python

4
推荐指数
1
解决办法
2713
查看次数

API测试的剧作家基本认证

我正在尝试使用 Playwright 进行 API 测试。简单的情况是我正在尝试获取有关用户的信息。要使用curl 执行此操作,我可以发出命令:

curl --user username:password https://example.com/api/user/id
Run Code Online (Sandbox Code Playgroud)

这将返回一些 JSON。超级简单。

我已经阅读了 Playwright 文档,观看了一些 YouTube 视频并搜索了各种来源,但不知道如何在 Playwright 中复制它!

我的请求始终得到“403 Forbidden”的响应。

在我的playwright.config.ts文件中,我添加了httpCredentials这样的内容:

curl --user username:password https://example.com/api/user/id
Run Code Online (Sandbox Code Playgroud)

与此同时,在我的apiExperiment.spec.ts文件中:

import type { PlaywrightTestConfig } from '@playwright/test';
import { devices } from '@playwright/test';

const config: PlaywrightTestConfig = {
  [...]

  use: {
    headless: false,
    /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
    actionTimeout: 0,
    /* Base URL to use in …
Run Code Online (Sandbox Code Playgroud)

playwright

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

访问 Playwright 中的同级元素

我的 DIV 中有两个兄弟跨度。我正在 Blazor 中进行 E2E 测试,我想访问第二个 Span 内容 ( @Status)。

<div>
     <span> Status:</span>
     <span> @Status</span>
 </div>
Run Code Online (Sandbox Code Playgroud)

我找到了一个解决方案,如果它是根据此链接的JavaScript 。

const text = await page.locator(':text(" Status:") + span').textContent();
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何对 C# 语法执行相同的操作。我可以访问第一个跨度,但不能访问下一个跨度。

var firstSpan = Page.Locator("text= Status :");
Run Code Online (Sandbox Code Playgroud)

c# e2e-testing blazor playwright playwright-dotnet

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

在 Python 中以交互模式运行 playwright

我正在使用 playwright 使用 Python 来抓取页面。我知道如何使用脚本执行相同的操作,但我正在以交互模式尝试此操作。

from playwright.sync_api import Playwright, sync_playwright, expect
import time

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    page = context.new_page()
    page.goto("https://www.wikipedia.org/")

    context.close()
    browser.close()
with sync_playwright() as playwright:
    run(playwright)
Run Code Online (Sandbox Code Playgroud)

我尝试在交互模式下执行此操作:

>>> from playwright.sync_api import Playwright, sync_playwright, expect
>>> playwright = sync_playwright()
>>> browser = playwright.chromium.launch(headless=False)
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

from playwright.sync_api import Playwright, sync_playwright, expect
import time

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    page = context.new_page()
    page.goto("https://www.wikipedia.org/")

    context.close()
    browser.close()
with sync_playwright() as …
Run Code Online (Sandbox Code Playgroud)

python chromium web-scraping playwright playwright-python

4
推荐指数
1
解决办法
4696
查看次数

如何在单个定位器中按属性和文本查找元素?

如何使用 Playwright 使用单个定位器短语查找元素?

我的元素是:

<div class="DClass">Hello</div>
Run Code Online (Sandbox Code Playgroud)

我希望通过其类和文本找到该元素:

myElement = self.page.locator('text="Hello",[class="DClass"]')
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用?

python playwright playwright-python

4
推荐指数
1
解决办法
3440
查看次数

如何通过索引选择 Playwright (python) 中 iFrame 中包含的按钮?

我正在尝试使用 Python 和 Playwright 在 iframe 中选择一个按钮...在 Selenium 中我知道你可以通过使用索引来做到这一点,这在 playwright 中是否可能,我一直在挖掘文档,但似乎无法弄清楚出来。我尝试选择的 iframe 中包含的按钮是:

"button:has-text(\"Add New User\")"
Run Code Online (Sandbox Code Playgroud)

我正在使用的 iframe 的 html 代码类似于以下内容:

<iframe src="https://www.urlthatcannotbereturnedinpagehtml.com/veryparticularparameters" width="100%" style="height: 590px;"></iframe>
Run Code Online (Sandbox Code Playgroud)

有人有想法吗?关于这里束手无策......我试图通过解析网页的代码来找到url,但是这部分不能像那样选择。我可能只是对剧作家的文档感到不知所措,我在硒上花了很多时间,这似乎是一种全新的语言。

谢谢!

python iframe playwright

4
推荐指数
1
解决办法
6611
查看次数

剧作家重试动作

我这里有一个场景:点击元素A(一个按钮),触发元素B(比如一个div)出现。但由于多种因素的影响,点击可能无法触发事件。原因可能是当页面真正完全解决时点击太快。所以我需要重做几次点击。Playwright 中似乎没有一种机制可以在不满足条件时进行步骤级重试。不过,这听起来像是测试自动化中的常见要求。我想知道你如何解决这个问题。

一些建议或自定义代码来重试失败的步骤?

playwright

4
推荐指数
1
解决办法
3677
查看次数

如何使用剧作家期望来精确匹配两个可能值之一?

如何使用剧作家expect来检查两个精确匹配之一?

这是我的功能。

export const assertThirdPartyInternetPath = async (
  page: Page,
  path: string,
) => {
  expect(page.url()).toBe(path);
};
Run Code Online (Sandbox Code Playgroud)

我用它来测试维基百科页面的链接。

await this.assertThirdPartyInternetPath('https://en.wikipedia.org/wiki/Larry_Sanger'

但是,维基百科等一些网站会将移动设备(包括剧作家设备)重定向到子m域。

所以我想断言用户位于https://en.wikipedia.org/wiki/Larry_Sangerhttps://en.m.wikipedia.org/wiki/Larry_Sanger。我怎样才能做到这一点?

请注意,我想要进行精确匹配;我知道我可以使用expect(string.toContain(myPattern),但我有很多东西要匹配,我想做精确匹配。

playwright

4
推荐指数
1
解决办法
6478
查看次数