由于 ESPN 不提供 API,我尝试使用 Puppeteer 来抓取有关我的梦幻足球联赛的数据。但是,由于登录表单与 iframe 元素嵌套,我很难尝试使用 puppeteer 登录。
我去了http://www.espn.com/login并选择了 iframe。除了主要部分,我似乎无法选择 iframe 中的任何元素
frame.$('.main')
Run Code Online (Sandbox Code Playgroud)
这是似乎通过登录表单获取 iframe 的代码。
const browser = await puppeteer.launch({headless:false});
const page = await browser.newPage();
await page.goto('http://www.espn.com/login')
await page.waitForSelector("iframe");
const elementHandle = await page.$('div#disneyid-wrapper iframe');
const frame = await elementHandle.contentFrame();
await browser.close()
Run Code Online (Sandbox Code Playgroud)
我希望能够访问 iframe 元素中的用户名字段、密码字段和登录按钮。每当我尝试访问这些字段时,都会返回 null。
我正在尝试使用 puppeteer 和 xpath从已经填写的表单中自动检索表单值。
我已经按如下方式自动填充文本输入字段,但使用 .evaluate() 执行相反的操作不起作用:
[fieldHandle] = await page.$x("//label[text() = 'My Label']/../following-sibling::td[1]//input")
await page.evaluate((x, y) => x.value = y, fieldHandle, 'newValue')
Run Code Online (Sandbox Code Playgroud)
这是我最近的尝试 - 仍然没有成功......
let [fieldHandle] = await page.$x("//label[text() = 'My Label']/../following-sibling::td[1]//input")
let fieldRaw = await fieldHandle.getProperty('textContent')
let fieldValue = await fieldRaw.jsonValue()
Run Code Online (Sandbox Code Playgroud)
希望有人知道如何实现这一目标!
我正在使用 Playwright 的 C# 语言绑定。
HTML 示例:
<select id="txtType" name="Type" class="form-control">
<option>Blog Posts</option>
<option>Books</option>
<option>Presentations</option>
<option>Videos</option>
<option>Podcasts</option>
<option>Examples</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我知道我可以用来Page.SelectOptionAsync设置下拉列表的选定选项,但如何获取当前选定的选项?
当我查看 DropDown 的所有属性时,我看不出ElementHandles.
我需要拦截网络请求并将其响应主体保存到变量中,这样我就可以使用 UI 上显示的值执行断言,但是当我尝试访问应该包含已保存响应主体的变量时,我会收到 [object Object]一个有效的机构。
JSON.stringify 也不能解决问题,因为我的变量变成了{"_type":"Page","_guid":"page@"}而不是实际的响应。
这是代码:
const resp = await page.on('response', async response => {
if (response.url().includes('/some_url/') && response.status() === 200) {
console.log('BODY() ' + (await response.body())); //logs valid JSON response body
return await response.body();
}
})
console.log('RESPONSE' + resp); //logs RESPONSE[object Object]
Run Code Online (Sandbox Code Playgroud) javascript automated-tests webautomation e2e-testing playwright
我正在尝试使用剧作家测试在选项卡之间切换,但它没有控制 windows 元素。我们有类似 playwright 中的 selenium driver.switchto().window() 的方法吗?
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false, args: ['--start-maximized'] });
const context = await browser.newContext({ viewport: null });
context.on("page", async newPage => {
console.log("***newPage***", await newPage.title())
})
const page = await context.newPage()
const navigationPromise = page.waitForNavigation()
// dummy url
await page.goto('https://www.myapp.com/')
await navigationPromise
// User login
await page.waitForSelector('#username-in')
await page.fill('#username-in', 'username')
await page.fill('#password-in', 'password')
await page.click('//button[contains(text(),"Sign In")]')
await navigationPromise
// User lands …Run Code Online (Sandbox Code Playgroud) 我知道puppeteer得到它自己的句柄而不是标准DOM元素,但我不明白为什么我不能通过找到的元素继续相同的查询作为
const els = await page.$$('div.parent');
for (let i = 0; i < els.length; i++) {
const img = await els[i].$('img').getAttribute('src');
console.log(img);
const link = await els[i].$('a').getAttribute('href');
console.log(link);
}
Run Code Online (Sandbox Code Playgroud) 我有 PHP 脚本,我使用带有 URL 参数的代码调用 python 函数:
import json
import sys
import urllib.parse
link = urllib.parse.unquote(sys.argv[1])
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36')
page = context.new_page()
cookie_file = open('./cookies.json')
cookies = json.load(cookie_file)
print(cookies)
context.add_cookies(cookies)
page.goto(link)
try:
page.wait_for_timeout(10000)
print(page.innerHTML("*"))
page.close()
context.close()
browser.close()
except Exception as e:
print("Error in playwright script.")
page.close()
context.close()
browser.close()
Run Code Online (Sandbox Code Playgroud)
但是,当我访问页面后想打印页面源时,我收到
Error in playwright script.
Run Code Online (Sandbox Code Playgroud)
因为我尝试过的代码不起作用:
print(page.innerHTML("*"))
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?
python webautomation python-3.x playwright playwright-python
使用 PuppeteerSharp,我试图获取元素的文本。
ElementHandle elementHandle = await page.XPathAsync("//html/body/div[1]/section/div/section/h2")[0];
Run Code Online (Sandbox Code Playgroud)
现在我有了元素句柄,我该如何从中获取文本呢?我没有看到任何明显的方法。我本来期望 TextAsync 或类似的东西,但我没有看到它。
使用 PuppeteerSharp 5.0。
例如,我正在测试一个搜索页面,它将显示结果编号.text > span:nth-child(1)。
但是,如果没有任何结果,则仅显示text="nothing"或.text > span:nth-child(1)不存在。
那么我怎样才能同时满足这两个条件呢?
javascript ×5
playwright ×5
node.js ×3
puppeteer ×3
.net ×2
.net-core ×2
c# ×2
dotnet-test ×1
e2e-testing ×1
iframe ×1
python ×1
python-3.x ×1
xpath ×1