我正在将 scrapy 与 playwright 集成,但发现自己在单击后添加计时器时遇到困难。因此,当我点击后截取页面的屏幕截图时,它仍然挂在登录页面上。
如何集成计时器以便页面等待几秒钟直到页面加载?
选择器
.onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.onetrust-lg.ot-close-icon下面替换为.onetrust-close-btn-handlerimport 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) <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”
我正在创建一个网络自动化,我需要保持浏览器打开,但由于剧作家库只开始显示代码,包括每次脚本完成时浏览器自行关闭的“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) 我正在尝试使用 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) 我的 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) 我正在使用 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) 如何使用 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 在 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,但是这部分不能像那样选择。我可能只是对剧作家的文档感到不知所措,我在硒上花了很多时间,这似乎是一种全新的语言。
谢谢!
我这里有一个场景:点击元素A(一个按钮),触发元素B(比如一个div)出现。但由于多种因素的影响,点击可能无法触发事件。原因可能是当页面真正完全解决时点击太快。所以我需要重做几次点击。Playwright 中似乎没有一种机制可以在不满足条件时进行步骤级重试。不过,这听起来像是测试自动化中的常见要求。我想知道你如何解决这个问题。
一些建议或自定义代码来重试失败的步骤?
如何使用剧作家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_Sanger或https://en.m.wikipedia.org/wiki/Larry_Sanger。我怎样才能做到这一点?
请注意,我想要进行精确匹配;我知道我可以使用expect(string.toContain(myPattern),但我有很多东西要匹配,我想做精确匹配。
playwright ×10
python ×4
blazor ×1
c# ×1
chromium ×1
e2e-testing ×1
iframe ×1
scrapy ×1
web-scraping ×1