我正在反应应用程序中运行剧作家。我的目标是立即返回缓存结果的结果。
下面是能够设置和获取缓存。但下次请求相同的 URL 时,它的行为就好像它没有保存在缓存中一样。我缺少什么?
const { chromium } = require('playwright');
const LRU = require('lru-cache');
const cache = new LRU({
max: 500, // Max number of entries in the cache
ttl: 86400 // Time to live for an entry in the cache, in milliseconds
});
async function fetchHTML(url) {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
page.setDefaultTimeout(10000);
// Check if the URL is in the cache
let html = cache.get(url);
if (html) { …Run Code Online (Sandbox Code Playgroud) 当我运行测试时,出现以下错误。我对剧作家和编码相当陌生,所以我不确定解决方案是什么
\nError: locator.click: Error: strict mode violation: getByRole(\'button\', { name: \'Statements\' }) resolved to 2 elements:\n1) <button title="Statements" aria-label="Statements" data-\xe2\x80\xa6>Statements</button> aka locator(\'#lp_line_6_a11y_queue\').getByRole(\'button\', { name: \'Statements\' })\n2) <button title="Statements" aria-label="Statements" data-\xe2\x80\xa6>Statements</button> aka locator(\'#lp_line_6\').getByRole(\'button\', { name: \'Statements\' })\nRun Code Online (Sandbox Code Playgroud)\n我刚刚进行了测试,希望不会出现错误。
\ntest(\'test\', async ({ page }) => {\n await page.goto(\'https://www.test.com\'); \n await page.getByPlaceholder(\'Section tag #1\').click();\n await page.getByPlaceholder(\'Section tag #1\').press(\'Control+a\');\n await page.getByPlaceholder(\'Section tag #1\').fill(\'inapptest\');\n\n await page.getByRole(\'button\', { name: \'UPDATE\' }).click();\n await page.getByRole(\'button\', { name: \'Message us\' }).click();\n await page.getByPlaceholder(\'Enter text here\').click();\n await …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到有关如何使用 Playwright e2e 测试模拟服务器端请求的任何文档或示例。Playwright 的官方文档分享了如何模拟/拦截客户端调用的示例。https://playwright.dev/docs/mock
在由 Next.js 为 SSR 提供支持的 React 应用程序中,有没有办法在返回给客户端之前模拟 API 调用?
我至少有三个选项可以单击按钮:
\nawait page.Locator("button", new() { HasText = "\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd1\x82\xd1\x8c" }).ClickAsync();await page.GetByRole(AriaRole.Button, new() { Name = "\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd1\x82\xd1\x8c" }).ClickAsync();await page.GetByText("\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd1\x82\xd1\x8c") .ClickAsync();根据我的实际观察,我执行此操作的页面可以在 HTML 标记中为此按钮提供 2 个选项:
\n#app-content > div > div > div._1hAP9 > div > div.f\\\\+e\\\\+A > button\nxpath:/html/body/div[1]/div[1]/div[2]/div/div/div[4]/div/div[2]/button#app-content > div > div > div._1hAP9 > div > div > button\nxpath:/html/body/div[1]/div[1]/div[2]/div/div/div[7]/div/div/button同时,从开发者控制台document.querySelector将在两个 HTML 变体的两个路径中找到该按钮。但从剧作家的角度来看,他们有时有效,有时无效。同时,执行继续进一步执行命令,就好像进行了单击一样,尽管实际上并没有发生(我使用参数观察了浏览器的行为headless=false)。
另外,Force = true …
我已登录网页,使用木偶师/剧作家导航到目标网页,并希望根据请求下载 csv 文件。
请求标头包括 Authorization: "Bearer eyJ0eXAiOiJKV......"
是否可以从木偶师/剧作家那里获得授权:“承载令牌”并将其提交给请求(例如axios)。
非常感谢
我如何返回 elem 的值,以便我可以验证它是真的1?
const elem = await page.$('input#my-input')
await elem.fill('1')
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习 Python 版本的 Playwright。看这里
我想学习如何定位一个元素,以便我可以用它做事。就像打印内部 HTML,点击它等等。
下面的示例加载页面并打印 HTML
from playwright import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.newPage()
page.goto('http://whatsmyuseragent.org/')
print(page.innerHTML("*"))
browser.close()
Run Code Online (Sandbox Code Playgroud)
此页面包含一个元素
<div class="user-agent">
<p class="intro-text">Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4238.0 Safari/537.36</p>
</div>
Run Code Online (Sandbox Code Playgroud)
使用 Selenium,我可以找到元素并像这样打印它的内容
elem = driver.find_element_by_class_name("user-agent")
print(elem)
print(elem.get_attribute("innerHTML"))
Run Code Online (Sandbox Code Playgroud)
我怎样才能在剧作家中做同样的事情?
使用 Playwright for Python,我想等待内容更改。
我可以像这样获取选择器的内容
month = page.querySelector('.day__month_btn').innerText()
Run Code Online (Sandbox Code Playgroud)
在此示例中,我正在读取日期选择器元素的月份值,并希望选择下个月。然后等待,直到月份发生变化。
要更改月份,我可以单击下个月图标
page.querySelector('.next').click()
Run Code Online (Sandbox Code Playgroud)
我现在想等到点击被接受。
一种 hacky 的方法是等待,即重复获取该值,直到它发生变化
while True:
if page.querySelector('.day__month_btn').innerText() != month:
break
time.sleep(0.2)
Run Code Online (Sandbox Code Playgroud)
在现实世界中,我还需要检查超时。
有一个更好的方法吗?
我的目标:
\n在加载第一个页面(一个巨大的 html)时导航到第二个页面。
\n当前状态:
\n该脚本一直运行到最后,然后await browser.close()崩溃。
剧本:
\nconst { chromium } = require(\'playwright\');\n\n(async () => {\n const browser = await chromium.launch({ headless: false })\n const page = await browser.newPage()\n\n await page.setViewportSize({ width: 1200, height: 800 })\n\n // asynchronous loading\n page.goto(\'http://localhost:1234/index1.htm\')\n\n // wait for the button that navigates to another page\n await page.waitForSelector(\'#button1\');\n \n // button exists. Click it to navigate to index2.htm\n await page.click(\'#button1\')\n \n // await the #first_span element exists in index2.htm …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 playwright 捕获 json 响应。我不断收到待处理的 Promise。但是,在 headless:false 模式下,我可以看到数据正在被接收并填充在浏览器上。我刚刚开始玩Playwright,对《Promise》也不是很熟悉。
我尝试过的如下:
(async () => {
let browser = await firefox.launch({headless: true, userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'});
let page = await browser.newPage();
page.waitForResponse(async(response) => {
if (response.url().includes('/abcd') && response.status() == 200) {
let resp = await response.json();
console.log(resp);
}
});
await page.goto('https://myurl.com', {waitUntil: 'networkidle', timeout: 30000});
await page.waitForTimeout(20000);
await browser.close();
})
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我尝试过增加超时时间。没有帮助。
playwright ×10
javascript ×3
node.js ×2
python ×2
asp.net ×1
asynchronous ×1
caching ×1
e2e-testing ×1
lru ×1
mocking ×1
next.js ×1
promise ×1
puppeteer ×1
reactjs ×1
typescript ×1