const playwright = require("playwright");
(async () => {
const browsers = ["chromium", "firefox", "webkit"];
for (const browserType of browsers) {
const browser = await playwright[browserType].launch({args: ['--no-sandbox']});
const context = await browser.newContext();
const page = await context.newPage("http://whatsmyuseragent.org/");
await page.screenshot({ path: `example-${browserType}.png` });
}
})();
Run Code Online (Sandbox Code Playgroud)
运行此脚本后,我得到 UnhandledPromiseRejectionWarning: Error: Firefox revision is not download. 在控制台中运行“npm install”或“yarn install”。如何解决?
如何使用剧作家获取页面上的所有图像?我只能ElementHandle通过以下代码获得一个 ( ),但不能获得一个集合。
const { chromium } = require("playwright");
class Parser {
async parse(url) {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(url);
await page.waitFor("img");
// TODO: get somehow collection of elements
return await page.$("img");
}
}
module.exports = Parser;
Run Code Online (Sandbox Code Playgroud)
在远处的另一个模块中的某处:
const Parser = require("./path/to/dir/Parser.js");
const parser = new Parser();
parser
.parse(body.url)
.then(elemHandle => {
// here I get only one ElementHandle object, but suppose to get an array or collection
})
.catch(err => …Run Code Online (Sandbox Code Playgroud) ?ase: 有一个列表,您需要在其中选择一个项目,然后关闭。当您单击另一个项目时,列表没有时间关闭。最后,再次单击另一个列表元素。
await page.waitForSelector('.list');
await page.click('.list');
await page.waitForSelector('.list-element');
await page.click('.list-element'); // click on the list element and list closes
await page.click('.another-element'); // click on the list
Run Code Online (Sandbox Code Playgroud) 我需要测试这个元素何时出现在 DOM 上。我想用“标题”来表达这一点。NBA 部分始终保持不变,另一部分“0c381941-0”是动态的。
我试过
await page.waitForSelector('.identifier.identifier-group[title=`NBA ${idVariable}`)
但这些反引号在那里是不可接受的。
有什么线索吗?
<dl class="identifier identifier-group" title="NBA 0c381941-0">
<dl class="player-identifier-label identifier" title="NHI 0c381941-0">
<dt><span>NBA</span></dt>
<dd><span>0c381941-0</span></dd>
</dl>
</dl>
Run Code Online (Sandbox Code Playgroud) 如何在 playwright 中运行自定义 js 函数?例如显示警报。我已经尝试过这种方式,但没有奏效。
var url = await page.evaluate(async() => {
await function alert() {
alert("alert");
}
await alert();
});
Run Code Online (Sandbox Code Playgroud) javascript webautomation puppeteer chrome-devtools-protocol playwright
我正在使用一个 python 模块,该模块在我的 Heroku Flask 应用程序中使用 playwright。该模块的安装说明要求我安装浏览器二进制文件,例如:
python -m playwright install
Run Code Online (Sandbox Code Playgroud)
虽然当我在本地部署它时它可以工作,但我似乎无法将浏览器二进制安装合并到部署中。我尝试改用heroku playwright buildpack(https://github.com/mxschmitt/heroku-playwright-buildpack),但这似乎不起作用,并且出现如下错误:
2020-11-17T23:06:42.252585+00:00 app[web.1]: "webkit" browser was not found.
2020-11-17T23:06:42.252585+00:00 app[web.1]: Please complete Playwright installation via running
2020-11-17T23:06:42.252585+00:00 app[web.1]:
2020-11-17T23:06:42.252586+00:00 app[web.1]: "python -m playwright install"
Run Code Online (Sandbox Code Playgroud)
我还尝试在构建包中手动添加python -m playwright install命令,但这也不起作用。有没有办法在heroku中使用playwright正确安装二进制文件?
在 Web 应用程序(在 React 中实现)中,当我按下特定按钮时,会打开一个新的浏览器选项卡。我想检查是否发生了这种情况以及新选项卡的 URL 是否正确。
我已经成功地在 python 中使用 Playwright 从页面中获取元素。我现在遇到了从嵌入iframe的文档中获取元素的挑战。作为示例,我使用了w3schools 页面来解释<option>element,该页面在 iframe 中显示结果。<option>我正在尝试从 iframe 中检索该元素的句柄。
获取页面上的 an 元素的“正常”方式page.querySelector()无法获取 an elementHandle,这只会打印<class 'NoneType'>:
with sync_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = browser_type.launch(headless=False)
page = browser.newPage()
page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')
element = page.querySelector('select')
print(type(element))
browser.close()
Run Code Online (Sandbox Code Playgroud)
我尝试首先显式获取 iframe 的句柄,但这会产生相同的结果 ( <class 'NoneType'>):
with sync_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = browser_type.launch(headless=False)
page = browser.newPage()
page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')
iframe = page.querySelector('iframe')
element = …Run Code Online (Sandbox Code Playgroud) 我试图在 docker 中运行该剧作家,但出现此错误:
browserType.launch: Host system is missing dependencies!
Missing libraries are:
libvpx.so.6
libicui18n.so.66
libicuuc.so.66
libwoff2dec.so.1.0.2
libharfbuzz-icu.so.0
libgstgl-1.0.so.0
libgstcodecparsers-1.0.so.0
libjpeg.so.8
libenchant.so.1
libsecret-1.so.0
libhyphen.so.0
libGLESv2.so.2
Run Code Online (Sandbox Code Playgroud)
然后我尝试安装必要的库,通过添加以下内容来使捆绑版本的剧作家工作:
RUN apt-get update && apt-get install -y wget --no-install-recommends \
&& apt-get update \
&& apt-get install -y \
libvpx6 \
lib64icui18n66 \
libicuuc66 \
....
Run Code Online (Sandbox Code Playgroud)
但我仍然收到这些错误:
E: Unable to locate package libvpx6 // I tried with libvpx5 but got the same error
E: Unable to locate package lib64icui18n66
E: Unable to locate package libicuuc66 …Run Code Online (Sandbox Code Playgroud) 我读过一些与此相关的不同的质量保证,但似乎没有一个有效。
我正在尝试使用名为 mat-radio-checked 的类来定位名为 mat-radio-button 的元素(Angular)。然后选择内部文本。
在 Chrome 中这很简单:
https://i.stack.imgur.com/Ev0iQ.png
https://i.stack.imgur.com/lVoG3.png
要找到 Playwright 中匹配的第一个元素,我可以执行以下操作:
let test: any = await page.textContent(
"mat-radio-button.mat-radio-checked"
);
console.log(test);
Run Code Online (Sandbox Code Playgroud)
但如果我尝试这个:
let test: any = await page.$$(
"mat-radio-button.mat-radio-checked"
);
console.log(test);
console.log(test[0]);
console.log(test[1]);
});
Run Code Online (Sandbox Code Playgroud)
它不返回我可以选择其内部文本的元素数组。
我需要能够找到该类的所有元素,以便我可以使用 Expect 来确保返回的内部文本正确,例如:
expect(test).toBe("Australian Citizen");
Run Code Online (Sandbox Code Playgroud) javascript automation browser-automation typescript playwright
playwright ×10
javascript ×4
puppeteer ×3
python ×2
automation ×1
dependencies ×1
docker ×1
heroku ×1
iframe ×1
node.js ×1
typescript ×1
web-scraping ×1