折腾:
【未解决】pyppeteer中如何定位查找百度搜索输入框
期间,继续试试,给输入框中输入文字
pyppeteer input text
好像是用type 表示input输入?
awaitpage.keyboard.type('Hello, World!')
awaitpage.keyboard.press('ArrowLeft')
awaitpage.keyboard.down('Shift')都是keyboard的
await page.type('input[name=pickupAgingComment]', 'test comment', {delay: 20})好像是:只有针对于page级别的type去输入?
没有针对 已找到的元素 去操作的?
puppeteer的逻辑是:
await page.focus('#lst-ib')
page.keyboard.type('China')先focus,再type
另外:
await page.evaluate((a, b) => {
document.querySelector('#a').value = a;
document.querySelector('#b').value = b;
document.querySelector('#c').click();
}, a, b);去找找是否有:
对于前面xpath找到的 元素
<coroutine object Page.xpath at 0x10f15cdb0>
?
去操作的
“coroutine xpath(expression: str) → List[pyppeteer.element_handle.ElementHandle][source]
Evaluate the XPath expression.
If there are no such elements in this page, return an empty list.
Parameters:
expression (str) – XPath string to be evaluated.“
pyppeteer input text
content = "My content" # This will be filled into <input id="myinput"> !
await page.evaluate(f"""() => {{
document.getElementById('myinput').value = '{content}';
}}""")这么麻烦?
算了,先去试试:
page.focus(SearchInputXpath) searchStr = "crifan" page.keyboard.type(searchStr)
结果:
有警告:
/Users/crifan/dev/dev_root/python/puppeteerBaiduSearch/puppeteerBaiduSearch.py:18: RuntimeWarning: coroutine 'Page.focus' was never awaited page.focus(SearchInputXpath)
换成:
await page.focus(SearchInputXpath)
结果:
发生异常: ElementHandleError Evaluation failed: DOMException: Failed to execute 'querySelector' on 'Document': '//input[@id='kw']' is not a valid selector.

看来不支持xpath
要去换成selector
直接去试试click
SearchInputXpath = "//input[@id='kw']"
searchInputElem = page.xpath(SearchInputXpath)
print("searchInputElem=%s" % searchInputElem)
searchInputElem.click()结果:
发生异常: AttributeError 'coroutine' object has no attribute 'click'

# 打印当前页标题
print(await page.title())
# 抓取新闻内容 可以使用 xpath 表达式
"""
# Pyppeteer 三种解析方式
Page.querySelector() # 选择器
Page.querySelectorAll()
Page.xpath() # xpath 表达式
# 简写方式为:
Page.J(), Page.JJ(), and Page.Jx()
"""
element = await page.querySelector(".feed-infinite-wrapper > ul>li") # 纸抓取一个
print(element)
# 获取所有文本内容 执行 js
content = await page.evaluate('(element) => element.textContent', element)
print(content)打算换用:
searchInputElem = await page.querySelector("")但是要去搞清楚
如何写css的selector
css selector 语法
CSS 选择器参考手册
对于元素:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
感觉是:
input[id=kw]
试试
searchInputElem = await page.querySelector("input[id=kw]")
print("searchInputElem=%s" % searchInputElem)
searchInputElem.click()结果

好像是能找到元素?
searchInputElem.click()
运行后,至少没报错。
不过后续的:
searchStr = "crifan" page.keyboard.type(searchStr)
并没有输入内容:

好像
await page.type('input[name=pickupAgingComment]', 'test comment', {delay: 20})是可以的?
去试试
写了:
searchStr = "crifan"
page.type("input[id=kw]", searchStr, delay=20)然后发现:
page.type
可以查看源码
/Users/crifan/.pyenv/versions/3.6.6/lib/python3.6/site-packages/pyppeteer/page.py
async def type(self, selector: str, text: str, options: dict = None,
**kwargs: Any) -> None:
"""Type ``text`` on the element which matches ``selector``.
If no element matched the ``selector``, raise ``PageError``.
Details see :meth:`pyppeteer.input.Keyboard.type`.
"""
frame = self.mainFrame
if not frame:
raise PageError('no main frame.')
return await frame.type(selector, text, options, **kwargs)运行有警告:
/Users/crifan/dev/dev_root/python/puppeteerBaiduSearch/puppeteerBaiduSearch.py:22: RuntimeWarning: coroutine 'Page.type' was never awaited
page.type("input[id=kw]", searchStr, delay=20)去加上:await
await page.type("input[id=kw]", searchStr, delay=20)结果:

终于可以输入了。
后来发现:
await page.focus('#email')
await page.keyboard.type('test54')也是可以的。
【总结】
此处对于元素:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
想要输入文字,则:
(方式1)
无需,也没法,定位元素,再输入
而是:直接定位并输入
定位此处只适合用:Selector
此处Selector写法是:
"input[id='kw']"
然后输入是用type函数。
完整代码是:
searchStr = "crifan" SearchInputSelector = "input[id='kw']" await page.type(SearchInputSelector, searchStr, delay=20)
即可。
(方式2)先(通过selector)focus,再(用keyboard)type
代码:
searchStr = "crifan" SearchInputSelector = "input[id='kw']" await page.focus(SearchInputSelector) await page.keyboard.type(searchStr)
(方式3)更复杂的:
先selector
在click(类似于focus)
再用keyboard输入type
代码是:
searchStr = "crifan" SearchInputSelector = "input[id='kw']" searchInputElem = await page.querySelector(SearchInputSelector) await searchInputElem.click() await page.keyboard.type(searchStr)
即可。
注意:一定要加await,否则:代码运行无效果。且还会报警告:
/Users/crifan/dev/dev_root/python/puppeteerBaiduSearch/puppeteerBaiduSearch.py:18: RuntimeWarning: coroutine 'ElementHandle.click' was never awaited searchInputElem.click()
相关文档
coroutine type(selector: str, text: str, options: dict = None, **kwargs) → None[source] API Reference — Pyppeteer 0.0.25 documentation
转载请注明:在路上 » 【已解决】pyppeteer如何给输入框中输入文字