使用Playwright
和Python
,我如何期望计数大于或小于?
例如,此代码期望计数为 2。
如何实现计数 >= 2 (仅更大)
expect(self.page.locator('MyLocator')).to_have_count(2, timeout=20 * 1000)
Run Code Online (Sandbox Code Playgroud) const { webkit } = require('playwright');
(async () => {
const browser = await webkit.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
// Log and continue all network requests
page.route('**', route => {
console.log(route.request());
route.continue();
});
await page.goto('https://www.sahibinden.com');
//await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)
当我在隐身窗口中打开它并使用 fiddler 拦截时,我能够获得这些标题:
X-Client-SrcPort: 49784
Accept-Language: en-US,en;q=0.9
X-J3PopQvX-a: eRELp_ivj7vKEvBmbMRSG-kfU55GIHd5Wc4a06qtEa8-W4hUa90nd0GhKDAoOzTOE6nbdU270qt3pEYVVmFKgVTToiLUqAr9yF684URRjFEdbaPsZXZSQYAJBYyvVsSi_K44SKCEGPl3aAksgQ35gw27vJvvBuscZzVhLbW5PQgfeiMKVbRrWpbR5xHUuVtZ2WWJm7HboV5kXXpkiMPA5vOktA-g4mGZm_zh6ag-OMFmLSfnepSm4PEc=xUFop6_-RYgRLI020e8S8uXXWsuQR95QLXnPCQHvZ3yRFRBtHAG6j0natnjXAxodDcm2Z_tiq7H36uRojXmBVE6A=BwWr0j-cXmsXEuSiKPairOZ6lOskntyNSoE0mao=ge0YrWgZnvEWQIb8FPadYSSufxYmxuGVur0v-5RBRcw=VCk6e6d2sbMDmuvr6zR-F_T_A4K-q-8LlnXywUUfpqG-GInbAyExoE5QdJoRiI8IdTX5NHY0uzddRbfuV9ItOwwY-0iYSMgQ=Aqr=XLeqozjSV7r_Enq0FPcQjNklgG6unf=I3VMURNTQb42pvqWK5RSa-FAD3bTCp4a_OAV=Zx3cIV9JTsSpKKMmFo5q4PMPbj9boGSLSqORhvP95PwMAxyEeMUNbnorRlVOlKH3h2h2sH9rf768CgsXo-GMzCWwQXfoEuKGyl2vRQeP_rddkJ3RHuawS=Z38p69xNcjXr9J_zX4YVoAdXxN56Jm=Qo5K8Xsz3ndwSuvBJYnPXfXNr9Et80GYIjcx-TOkr5ZmPAbRIHkZVKacYvNG_utrkSQmn63IYYydikScedTdnUW5ky=gW3sliikzmZh-cRGaGIaA7FD5Un0Gc8TER6x_mKq-vL5nSuCOnHmzRTNBXZteNk8Gghe6V=ZnRNfCWFeiijdqPP0iPohDEhnjtA32h5vvyCgkx6UWBhAqSsU4IJWGPx8v9S3NtcBuYgTdexPHjnpYVF2CjufPFq0YVL5-di_ATRDfQktSh9gnBdYtIP9ejYLrq6kW6bBm5dxJkgGFD2aEz4bO2QEvoMJ=kuQGc34MBpAG2=PmtA9TErE0WfFftgec-sQfDFn2v4kerFl88C6lGdR=QQu3RBYOdW3V2ZDOONEmzXKAWQDpEZtBrID0Sb8mkQFLcOlbN28tcR8kpha_2E=DgBgLETJE_NqLs=60RdznfPKTcbGmrpBpIZGUKYGoqYzu7AHG-U9MtUAzPP-PVrgA=uOHqN_iFtPl_SCREmnCCLmihX=SsiMCGtaTqvw3RHLYhcUociEskbQh8a4wpniDSp5OM82AHGyrRJK0b29J_KzEgzeGlNn-CLTa=8aaJRfXIIBxHs9Jr6o9Q2DKuwKxvLJpN9kkSMLNbn9Q8R7NeeEeR9oECc9D8h8WjCGkCYJXIPtp-0hpRrlkvvF5ezZhFE0D=GewHdENPEj7CTjqfClVQ=gtzPQF6lG8UX9SKYKxOdyH-jKXJNp2KYWNFTWXS6ZHc56hsw9apvtbxuMciLZYjd4ZGFmLOpHsd7liyRk3QalSm0zxCnnOAL88S=VKDvdWm_qHkslUSEYOOznKY6wqfMlUUxIvRQISzWKY56ajlfyx0qEY6VHuiWbph2kwLGyuVZ6zwmO7RtVCiwp3poGfEnaA2ILv2IwjYm_BIcw8W2joV5G5LwkyEoeUquQWGg9EI_NEW4TO=wKOnmnwFI_f43k595lTHhiYCAwamNnFuiTXA4ZjE5J3S_O45altEdQCYJyJey2K5_iUa--qTmB3OLVZcDA05jN9TTer=-8BCZm=B9F=L=oHYSUlUC=TuzgBRH52I9BnRHDhLW8-U5yy-zYuoq55W-pboEVmlpIocbkE5A6v4gZkgxkLMKk9OzhOGNe7IgIZ=rzP7ocA0CfIKUj80anZlQj8FpVapjmpjWfJlxiZQ9oVcxZWWeSZ9ZKbrGBbx4kja_kjZeVhXOtH0MQLdyqtjIuPKK9pFkvpAOBRv4xrDPpZPOzi59F97zhc2IPhNlgEq9-Dvnl2w40xKRnjBS2cihGy_s2HI2Rf8HsrtHqrWuVtZ7clf2pEwHmdEzIr3aIHSwRzIma_ymwUZ3y4mPqs_d=JtpbqFqd6xykIT_=6Ftz_tqDC4xgTsNUL7-f57F45qpTw5QUNi7CpNUR=wvGhEOskiY2A60ID8IzGlz5hAu785vhseZHnv2fIl5KeH=I=2TH7wJGsUQ-=XMMzg5O8f940hyGJ-y4cHvWppYDK6J6LRvU-AR_Ojb4YgGj9DXgWIWCFrbiS0XY53O-_MvUfsLiURAmsfy5ReKw6-i=rTJ-kN_tf7xcOEbHNCVjFR=ZpJV6LIsI2S5loedjIRHWPhqVI5rJe-NXLs9bo53qnYsWFHbMonxaERtC2ZTYAhbWZglUGHAjv-hqvq22kCGb5fCte6Zb5brvE9CPI8Y8PZ7BCFfcbTpLOAesvHNAxJMaBUVhRGOoYVAL7tq5E-FVmH9L=bdbBgOAXR9s5lHwMRleEOIpqHuyC32z5CC75FAJVly8IP7vLjCjKrDHhNu6yc_5MOvbOQO8CCr0TwLj_XsoSkshH9Q5ICGARL64Ts8F7pmDKC9EDyKR7lZ-tkAJXcCgJd_KCIGnHfULSlwoFrj5QPcVYvGMcaY3Jl4rjyIhctEKXkUiGDwzpjnYbhzVBpsIR=LW6VLVxQXinIFkyBob7lFlyX_y=Gm=5garfnBd29OZWjfym0qh0Em24hJXlbWE7ufXNFUAA8dPNfzjsFk=hOtnpqAokP56vsnOnK0Jl_fOl=5ycCZG6rqGeIDXbRbM_AEy=CPJbE_wbbB2S2Mp9g49Bv9tn_S3LPG_aA_aAWGVDSIVs-3=kwdIybN8y
X-J3PopQvX-d: AAaCxAiBBKCMgcGASZAQgICAACIqGSI6QDSXAaoclOq4s6T2AkpRq7ZjyDmvHZIRbYeFd-E
X-Forwarded-For: 39.41.162.210
X-Forwarded-Proto: https
X-J3PopQvX-f: A3r8AMZyAQAABWpomSNWTAA_aOd-ML0d_DenMFOwBhK_GRxSWvW5FLJRxZ2sAScpotKucnW8wH8AAEB3AAAAAA==
X-J3PopQvX-c: ACCn_sVyAQAAdkviREb3CdA4iVdSrR4-Gc4Y3RxJWrLhnUx8XioZIjpANJcB
X-TLS-Version: 771
X-J3PopQvX-z: q
Run Code Online (Sandbox Code Playgroud)
但是我无法通过执行上面的代码来获取这些标头。我如何获得这些?
编辑:我使用了答案,效果很好。只有一个缺失的部分。
page.route('**', route => {
const request = route.request() …
Run Code Online (Sandbox Code Playgroud) 是否可以定义禁用 Javascript 的浏览器来模拟爬虫如何查看页面?应该有一个可以通过的选项。
我正在尝试访问谷歌在剧作家中注册的新弹出窗口,但无法做到这一点。
await page.waitForSelector(signUpWithGoogle, { state: 'visible' })
await page.focus(signUpWithGoogle)
await page.click(signUpWithGoogle)
await page.fill('//input[@type="email"]', email)
Run Code Online (Sandbox Code Playgroud) 我想使用 Playwright 填充条纹卡元素。
常规定位器似乎不起作用。例如,以下示例不执行任何操作:
await page.fill('iframe input[name="cardnumber"]', '4242424242424242')
Run Code Online (Sandbox Code Playgroud)
如何使用 Playwright 填写卡输入信息(号码、CVC、有效期、邮政编码)?
如何阻止浏览器在每次测试语句完成后重新打开?我的意思是下面的代码应该在 1 页中继续。为什么浏览器关闭,再次打开并执行第二个测试。如何预防呢?谢谢
test('When user logs in', async ({page}) => {
const commonAction = new CommonAction();
await commonAction.gotoPage(page);
await expect(page).toHaveURL('https://uat.mercator.createit.dev/login');
await commonAction.login( page, janEmail, janPasswd );
});
test('Then user is in my account page', async ({page}) => {
const navigationAction = new NavigationAction();
await navigationAction.verifyAccountPage(page);
});
test('When user goes to newsletter subscriptions', async ({page}) => {
const navigationAction = new NavigationAction();
await navigationAction.goToNewsSubscription(page);
});
test('Then user is in Newsletter subscription page', async ({page}) => {
const navigationAction = new NavigationAction(); …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Playwright 来抓取一些数据。如何单击页面上与选择器匹配的所有链接?
const { firefox } = require('playwright');
(async () => {
const browser = await firefox.launch({headless: false, slowMo: 50});
const page = await browser.newPage();
await page.goto('https://www.google.com');
page.pause(); // allow user to manually search for something
const wut = await page.$$eval('a', links => {
links.forEach(async (link) => {
link.click(); // maybe works?
console.log('whoopee'); // doesn't print anything
page.goBack(); // crashes
});
return links;
});
console.log(`wut? ${wut}`); // prints 'wut? undefined'
await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)
一些问题:
console.log
里面$$eval
没有做任何事情。page.goBack() …
我正在与剧作家合作。我想从网络事件中获取响应正文(HTML),而不是等待 DOM 在浏览器中加载数据,然后解析元素。当前的工作流程看起来是这样的:
有时会返回大量数据,并且页面需要相当长的时间才能在浏览器中加载,但所有数据都已在网络事件中从客户端接收。我的问题是可以在 Playwright 中获取网络事件,而不是等待所有元素加载。
我找到了Network Events文档,并且能够获取 HTML,但它返回所有请求而不是单个请求。
我使用 Playwright 只是为了导航、表单提交和获取网站 HTML。
我正在编写剧作家测试并在我的本地计算机上测试它们,该计算机具有 SSL,但证书经常给出错误。
我想在本地计算机上进行开发时忽略所有与 HTTPS 相关的错误。(我将使用有效的证书在云中进行最终测试。)
对于浏览器,您可以像这样ignoreHTTPSErrors
添加:contextOptions
const config: PlaywrightTestConfig = {
projects: [
{
name: 'Safari MacBook Air',
use: {
browserName: 'webkit',
viewport: {
width: 2560,
height: 1620,
},
contextOptions: {
ignoreHTTPSErrors: true,
},
},
},
Run Code Online (Sandbox Code Playgroud)
但是,我找不到类似的选项devices
:
{
name: 'iPhone 6/7/8',
use: devices['iPhone 8'],
},
Run Code Online (Sandbox Code Playgroud)
如何忽略设备的 HTTPS 错误?
我有一个 NX 工作区,其中有一个名为 的应用程序my-app
。我想my-app
使用 NX 控制台运行应用程序的 Playwright 测试。目前 NX 不支持 Playwright 插件,因此我根据本教程创建了一个自定义 NX 执行器。我已经为执行者创建了必要的文件。之后,我在应用程序的project.json
文件中注册了自定义 e2e 命令。剧作家配置文件保留在该my-app
文件夹中。
当我运行时nx run my-app:e2e
,执行程序已被执行,但由于某种原因,剧作家没有启动。相反,我看到一个错误。
当我在控制台中手动运行时,剧作家触发的命令启动并进行必要的nx run my-app:e2e
测试。npx playwright test --config=apps/my-app/playwright.config.ts
项目.json
...
...
...
"e2e": {
"executor": "./tools/executors/playwright:playwright",
"options": {
"path": "apps/my-app/playwright.config.ts"
}
}
Run Code Online (Sandbox Code Playgroud)
执行器.json
{
"executors": {
"playwright": {
"implementation": "./impl",
"schema": "./schema.json",
"description": "Runs Playwright Test "
}
}
}
Run Code Online (Sandbox Code Playgroud)
隐含的ts
export default async function echoExecutor(
options: PlaywrightExecutorOptions, …
Run Code Online (Sandbox Code Playgroud) playwright ×10
javascript ×3
node.js ×2
python ×2
e2e-testing ×1
http ×1
jestjs ×1
nx-workspace ×1
request ×1