标签: playwright-python

使用 Playwright for Python,如何选择(或查找)一个元素?

我正在尝试学习 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)

我怎样才能在剧作家中做同样的事情?

python webautomation playwright playwright-python

4
推荐指数
2
解决办法
2897
查看次数

使用 Playwright for Python,如何等待字段/选择器结果更改

使用 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)

在现实世界中,我还需要检查超时。

有一个更好的方法吗?

python webautomation playwright playwright-python

4
推荐指数
1
解决办法
7445
查看次数

如何添加剧作家的等待时间

我正在将 scrapy 与 playwright 集成,但发现自己在单击后添加计时器时遇到困难。因此,当我点击后截取页面的屏幕截图时,它仍然挂在登录页面上。

如何集成计时器以便页面等待几秒钟直到页面加载?

选择器

  • .onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.onetrust-lg.ot-close-icon下面替换为
  • .onetrust-close-btn-handler
import 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)

scrapy playwright playwright-python

4
推荐指数
1
解决办法
2万
查看次数

如何在没有上下文管理器的情况下在“with”之外启动剧作家

我正在创建一个网络自动化,我需要保持浏览器打开,但由于剧作家库只开始显示代码,包括每次脚本完成时浏览器自行关闭的“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)

python playwright playwright-python

4
推荐指数
1
解决办法
2713
查看次数

在 Python 中以交互模式运行 playwright

我正在使用 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)

python chromium web-scraping playwright playwright-python

4
推荐指数
1
解决办法
4696
查看次数

如何在单个定位器中按属性和文本查找元素?

如何使用 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 playwright-python

4
推荐指数
1
解决办法
3440
查看次数

导航到“url”,等待“load” - Python Playwright Issue

嘿,我在 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 playwright-python

3
推荐指数
1
解决办法
3万
查看次数

如何从python剧作家定位器对象获取外部html?

我找不到任何从 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)

python playwright playwright-python

3
推荐指数
1
解决办法
2736
查看次数

导入 playwright 失败,并显示“导入 _greenlet 时 DLL 加载失败”

为什么剧作家文件中会出现这个错误?

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)

python playwright-python

3
推荐指数
1
解决办法
3019
查看次数

如何期望计数大于或小于?

使用PlaywrightPython,我如何期望计数大于或小于?

例如,此代码期望计数为 2。

如何实现计数 >= 2 (仅更大)

expect(self.page.locator('MyLocator')).to_have_count(2, timeout=20 * 1000)
Run Code Online (Sandbox Code Playgroud)

python playwright playwright-python

3
推荐指数
1
解决办法
1242
查看次数