我正在尝试学习 Python 版本的 Playwright。看这里
我想学习如何定位一个元素,以便我可以用它做事。就像打印内部 HTML,点击它等等。
下面的示例加载页面并打印 HTML
from playwright import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.newPage()
page.goto('http://whatsmyuseragent.org/')
print(page.innerHTML("*"))
browser.close()
Run Code Online (Sandbox Code Playgroud)
此页面包含一个元素
<div class="user-agent">
<p class="intro-text">Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4238.0 Safari/537.36</p>
</div>
Run Code Online (Sandbox Code Playgroud)
使用 Selenium,我可以找到元素并像这样打印它的内容
elem = driver.find_element_by_class_name("user-agent")
print(elem)
print(elem.get_attribute("innerHTML"))
Run Code Online (Sandbox Code Playgroud)
我怎样才能在剧作家中做同样的事情?
使用 Playwright for Python,我想等待内容更改。
我可以像这样获取选择器的内容
month = page.querySelector('.day__month_btn').innerText()
Run Code Online (Sandbox Code Playgroud)
在此示例中,我正在读取日期选择器元素的月份值,并希望选择下个月。然后等待,直到月份发生变化。
要更改月份,我可以单击下个月图标
page.querySelector('.next').click()
Run Code Online (Sandbox Code Playgroud)
我现在想等到点击被接受。
一种 hacky 的方法是等待,即重复获取该值,直到它发生变化
while True:
if page.querySelector('.day__month_btn').innerText() != month:
break
time.sleep(0.2)
Run Code Online (Sandbox Code Playgroud)
在现实世界中,我还需要检查超时。
有一个更好的方法吗?
我正在将 scrapy 与 playwright 集成,但发现自己在单击后添加计时器时遇到困难。因此,当我点击后截取页面的屏幕截图时,它仍然挂在登录页面上。
如何集成计时器以便页面等待几秒钟直到页面加载?
选择器
.onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.onetrust-lg.ot-close-icon下面替换为.onetrust-close-btn-handlerimport scrapy
from scrapy_playwright.page import PageCoroutine
class DoorSpider(scrapy.Spider):
name = 'door'
start_urls = ['https://nextdoor.co.uk/login/']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url=url,
callback = self.parse,
meta= dict(
playwright = True,
playwright_include_page = True,
playwright_page_coroutines = [
PageCoroutine("click",
selector = ".onetrust-close-btn-handler"),
PageCoroutine("fill", "#id_email", 'my_email'),
PageCoroutine("fill", "#id_password",
'my_password'),
PageCoroutine('waitForNavigation'),
PageCoroutine("click", selector="#signin_button"),
PageCoroutine("screenshot", path="cookies.png",
full_page=True),
]
)
)
def parse(self, response):
yield {
'data':response.body
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个网络自动化,我需要保持浏览器打开,但由于剧作家库只开始显示代码,包括每次脚本完成时浏览器自行关闭的“with”语句。我知道我可以用时间(100)快速解决这个问题,但这似乎不是最佳实践。我尝试创建类似的操作,但不使用 with 语句,但它不断关闭浏览器。如何解决此问题并保持浏览器打开?
请参阅下面我的代码:
from playwright.sync_api import sync_playwright
p = sync_playwright().start()
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.google.com/')
p.stop()
Run Code Online (Sandbox Code Playgroud) 我正在使用 playwright 使用 Python 来抓取页面。我知道如何使用脚本执行相同的操作,但我正在以交互模式尝试此操作。
from playwright.sync_api import Playwright, sync_playwright, expect
import time
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.wikipedia.org/")
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
Run Code Online (Sandbox Code Playgroud)
我尝试在交互模式下执行此操作:
>>> from playwright.sync_api import Playwright, sync_playwright, expect
>>> playwright = sync_playwright()
>>> browser = playwright.chromium.launch(headless=False)
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
from playwright.sync_api import Playwright, sync_playwright, expect
import time
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.wikipedia.org/")
context.close()
browser.close()
with sync_playwright() as …Run Code Online (Sandbox Code Playgroud) 如何使用 Playwright 使用单个定位器短语查找元素?
我的元素是:
<div class="DClass">Hello</div>
Run Code Online (Sandbox Code Playgroud)
我希望通过其类和文本找到该元素:
myElement = self.page.locator('text="Hello",[class="DClass"]')
Run Code Online (Sandbox Code Playgroud)
为什么它不起作用?
嘿,我在 python playwright 中有用于获取页面源代码的代码:
import json
import sys
import bs4
import urllib.parse
from bs4 import BeautifulSoup
server_proxy = urllib.parse.unquote(sys.argv[1])
link = urllib.parse.unquote(sys.argv[2])
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
#browser = p.chromium.launch(headless = False)
browser = p.chromium.launch(proxy={"server": server_proxy,'username': 'xxx',"password": 'xxx' })
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_tessco.json')
cookies = json.load(cookie_file)
context.add_cookies(cookies)
page.goto(link)
try:
page.wait_for_timeout(10000)
cont = page.content()
print(cont)
page.close()
context.close()
browser.close()
except Exception as e: …Run Code Online (Sandbox Code Playgroud) 我找不到任何从 python playwright 返回外部 html 的方法 page.locator(selector, **kwargs)。我错过了什么吗?
locator.inner_html(**kwargs)确实存在。但是,我尝试使用 pandas.read_html ,但它在表定位器内部 html 上失败,因为它触发了表标记。
我目前正在做的是使用 bs4 来解析 page.content()。就像是:
soup = BeautifulSoup(page.content(), 'lxml')
df = pd.read_html(str(soup.select('table.selector')))
Run Code Online (Sandbox Code Playgroud) 为什么剧作家文件中会出现这个错误?
ImportError: DLL load failed while importing _greenlet: The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chrome.launch()
page = browser.new_page()
page.goto("https://www.youtube.com/watch?v=FK_5SQPq6nY&list=PLYDwWPRvXB8_W56h2C1z5zrlnAlvqpJ6A&index=1")
page.screenshot(path="demo.png")
browser.close()
Run Code Online (Sandbox Code Playgroud) 使用Playwright和Python,我如何期望计数大于或小于?
例如,此代码期望计数为 2。
如何实现计数 >= 2 (仅更大)
expect(self.page.locator('MyLocator')).to_have_count(2, timeout=20 * 1000)
Run Code Online (Sandbox Code Playgroud)