如何获取使用 Playwright 启动的浏览器的 pid?我尝试过:browser.process().pid但不幸的是它没有成功。
我想使用 Playwright for Python 一次打开多个 url。但我正在努力弄清楚如何做。这是来自异步文档:
async def main():
async with async_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = await browser_type.launch()
page = await browser.newPage()
await page.goto("https://scrapingant.com/")
await page.screenshot(path=f"scrapingant-{browser_type.name}.png")
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)
这将按顺序打开每个 browser_type。如果我想并行进行,我该怎么做?如果我想对网址列表做类似的事情,我该怎么做?
我尝试这样做:
urls = [
"https://scrapethissite.com/pages/ajax-javascript/#2015",
"https://scrapethissite.com/pages/ajax-javascript/#2014",
]
async def main(url):
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.newPage()
await page.goto(url)
await browser.close()
async def go_to_url():
tasks = [main(url) for url in urls]
await asyncio.wait(tasks)
go_to_url()
Run Code Online (Sandbox Code Playgroud)
但这给了我以下错误:
92: RuntimeWarning: …Run Code Online (Sandbox Code Playgroud) python webautomation web-scraping playwright playwright-python
我正在使用 playwright.js 为https://target.com编写脚本,并且在您提交运输信息的页面上,如果您之前已完成结帐流程,它将提供使用已保存地址的选项目标帐户。
我想每次运行脚本时都输入新的运输信息,所以我必须让编剧在页面上点击删除,然后输入运输信息。
下面显示的函数用于单击删除,但随后超时if (await page.$$("text='Delete'") != [])而不是执行else该函数的一部分。
我怎样才能重写这个函数,让它简单地检查元素(选择器:)是否text='Delete'存在,如果存在则单击它,如果不存在则执行函数的填充部分?
async function deliveryAddress() {
if (await page.$$("text='Delete'") != []) {
await page.click("text='Delete'", {force:true})
await deliveryAddress()
} else {
await page.focus('input#full_name')
await page.type('input#full_name', fullName, {delay: delayms});
await page.focus('input#address_line1')
await page.type('input#address_line1', address, {delay: delayms});
await page.focus('input#zip_code')
await page.type('input#zip_code', zipCode, {delay: delayms});
await page.focus('input#mobile')
await page.type('input#mobile', phoneNumber, {delay: delayms});
await page.click("text='Save & continue'", {force:true})
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 (Python) 下载在浏览器中呈现的 PDF 文件(未显示为弹出窗口或下载)playwright。没有公开 URL,因此您不能简单地抓取链接并使用requests.get("file_url").
我试过了:
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.newPage(acceptDownloads=True)
await page.goto("www.some_landing_page.com")
async with page.expect_download() as download_info:
await page.click("a") # selector to a pdf file
download = download_info.value
path = download.path()
Run Code Online (Sandbox Code Playgroud)
我也尝试过page.expect_popup(),但没有运气。我的理解是,这不能使用 来完成pyppeteer,但如果可能的话,也欢迎这种方式的解决方案。
我是开发新手,在创建一个 e2e 测试时面临着一个真正的问题。
基本上,我有一个包含 2 行或更多行的表格,每行有 5 列(标题、x、y、z 按钮)。如何使用标题单击正确行上的按钮?(这是为了证明这个表的删除过程有效的测试)。我正在测试的应用程序是用 React 框架编写的,因此所有表都会频繁更改,我需要一种信任代码并且没有任何错误的方法。
我需要单击此元素,但它始终不在同一位置
超文本标记语言
<table>
<tr>
<td>Some Title</td>
<td>x</td>
<td>y</td>
<td>
<button>I need to click this</button>
</td>
</tr>
<!--other rows--!>
</table>
Run Code Online (Sandbox Code Playgroud)
这是我遇到的解决方案
const rows = await page.$$eval("tr", (row) =>
row.map((e) => e.textContent)
);
const correctRowIndex = rows.findIndex((e) => e.includes(TITLE_I_KNOW));
await page.click(
"//tr[normalize-space(.)='" + rows[correctRowIndex] + "']/td/button"
);
Run Code Online (Sandbox Code Playgroud)
期望的行为
我的代码似乎没有遵循最佳实践,我需要一个将其分为两部分的解决方案。
1 - 将正确的行保存到变量中
2 - 单击已保存行中包含的按钮
我们如何测试具有基于 Azure AD 的身份验证的 SPA?当用户打开应用程序时,用户首先被发送到 login.microsoftonline.com,并在输入用户电子邮件后,页面重定向回应用程序主页。在这种情况下,我们如何使用 Playwright 实现自动化?
我想测试一个元素是否已被渲染。所以我希望期望 if 存在。有这个命令吗?
\nawait page.goto(\xe2\x80\x98<http://localhost:3000/>');\nconst logo = await page.$(\xe2\x80\x98.logo\xe2\x80\x99)\n\n// expect(logo.toBeInDocument())\nRun Code Online (Sandbox Code Playgroud)\n 正如标题所说,我无法以非 root 用户身份在 Docker 容器内以无头模式运行 Firefox。考虑以下 Dockerfile,构建于docker build -t firefox .
FROM python:3.8-buster
RUN apt-get update -qq \
&& apt-get install -qy \
libappindicator1 \
libasound2 \
libatk1.0-0 \
libc6 \
libcairo2 \
libcups2 \
libdbus-1-3 \
libexpat1 \
libfontconfig1 \
libgbm-dev \
libgcc1 \
libgconf-2-4 \
libgdk-pixbuf2.0-0 \
libglib2.0-0 \
libgtk-3-0 \
libnspr4 \
libnss3 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libpci-dev \
libstdc++6 \
libx11-6 \
libx11-xcb1 \
libxcb1 \
libxcomposite1 \
libxcursor1 \
libxdamage1 \
libxext6 \ …Run Code Online (Sandbox Code Playgroud) 我有一个类似数组的节点对象(它是一个轮播),它们的顺序是在每次页面刷新时随机生成的,剧作家发现所有元素都是可见的,但其中一些元素在视口之外(基于收到的错误) 。我需要确保在尝试单击该元素时该元素位于视口内,否则我会收到一条错误消息,指出该元素位于视口外。
如何确定类似数组对象的随机选取的节点元素是否确实在视口内?
我一直在尝试使用 Playwright 与 Google Maps 或 OpenStreetMaps 等网站的地图组件进行交互。我尝试使用 browser.mouse.move()、browser.mouse.up() 和 browser.mouse.down() 的组合,并以文字作为参数。当我运行它时,它似乎根本没有对地图做任何事情。
有没有办法用 Playwright 移动地图?
我创建了一个 GitHub 存储库,以便可以轻松复制。我也会把代码放在下面。 https://github.com/vincent-woodward/Playwright-Map-Interaction
const { chromium } = require("playwright");
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
//await page.goto("https://www.google.com/maps");
await page.goto("https://www.openstreetmap.org/#map=4/38.01/-95.84");
await page.mouse.move(600, 300);
await page.mouse.down();
await page.mouse.move(1200, 450);
await page.mouse.up();
browser.close();
})();
Run Code Online (Sandbox Code Playgroud) playwright ×10
javascript ×4
node.js ×3
puppeteer ×2
docker ×1
e2e-testing ×1
firefox ×1
pyppeteer ×1
python ×1
python-3.x ×1
viewport ×1
web-scraping ×1