-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FEATURE] Expose Playwright async/await flavor #74
Comments
Exactly, currently the pytest plugin does only provide the sync APIs. So you need to launch browser etc. yourself, something similar to https://github.com/microsoft/playwright-python/blob/master/tests/async/conftest.py Shall I rename this issue title into a feature request for providing also the async flavor? |
Thanks.
Sure, go ahead. |
pytest-playwright
is not compatible with aiohttp
@mxschmitt I'm on Playwright v1.17 and I did try to copy-paste all the fixtures in the file you pointed here (except the
I quickly fixed it by changing
I'm pretty new to Python and pytest but I guess |
@dwiyatci why do you prefer async over sync? Understanding this use-case for the testing scenario would us help to prioritize it. |
@mxschmitt I would like to implement a custom |
@mxschmitt: I want to use this plugin together with aiohttp-pytest, because my project is based on aiohttp. Thats the reason why @maratori and i prefer (in this case) async over sync. |
any updates for this feature? |
It is very odd that there are async/sync versions of Playwright Python but the integration with pytest only supports sync. If the primary purpose of Playwright is to write tests, but the async version cannot be used with the dominant test framework, then what is the async version's purpose? If the async version is intended for applications other than testing, then this is still odd as we'd likely want to use pytest to test that code. On a more pragmatic level, as more and more applications are written using async libraries, more and more tests will need to be async. Also, having async tests allows us to use some cleaner semantics for things like processes that happen in parallel. There's also the issue (microsoft/playwright-python#1339 (comment)) I ran into that we can't even mix async/sync tests in the same test suite and use @mxschmitt, do you have pointers on how hard this would be/what would need to be done? |
@nathanielobrown I totally agree that providing an async layer would be cool! The reason why we didn't do it yet was that its more idiomatic to write tests in sync mode (debugging, you don't need to install other pytest plugins, REPL just works etc). Regarding how hard it is to implement, I think it hardly depends on the question how much code we want to duplicate. In general the pytest-playwright plugin is not a lot of code, to provide an async version, we could in theory just copy it and use the async version of Playwright and it should just work™️ . Something where I'm not sure about is if we need a dedicated plugin (PIP package) for the async version or if we can internally detect somehow if its async or sync and then do conditional logic. This requires some investigation. (happy to accept patches for it, just not something we prioritise, since not a lot of users have requested it so far.) |
@mxschmitt, that's great to hear there is no technical blocker. My initial thought would be to add new fixtures to the same package with Also this fix (microsoft/playwright-python#1339 (comment)) for the multiple event loops issue just worked from me and is topical. I'll probably work something up locally and if it works well can create a PR. |
Hey guys! |
Waiting for the async feature in pytest! |
Hey! What is the status of the feature? |
Hi! Any update? We need this as well :) |
We also need this feature to fully adopt playwright in our integration tests. |
Please prioritize higher to implement the python - Playwright with async. |
While we prepare things for releasing it as a separate package, here are instructions to install it from source for now, curious to hear your thoughts!
import pytest
@pytest.mark.asyncio(loop_scope="session")
async def test_foo(page):
await page.goto("https://github.com") I saw that https://github.com/m9810223/playwright-async-pytest is based on anyio, not sure whats the standard nowadays. |
That's great news! 🎉 I later modified https://github.com/m9810223/playwright-async-pytest to use
|
I'm curious to what the community currently is mostly using when testing with Pytest. I tried to find I think the
Do you mind elaborating on that? |
I tried the instructions from #74 (comment) just now, and as soon as a test requests the
Without the marker (I use
Now, my configuration also includes |
@bartfeenstra thanks for giving it a try - we are still figuring out the bits - so didn't release it as a version on Pypi yet. I think in your case you'd have to either put
Would a file-wide marker or doing it in conftest be fine for you or do you prefer asyncio_mode=auto? Due to the recent changes in the I'm curious why it works for you with Thank you all. |
What I don't want is to have to decorate every other asynchronous test method in my codebase. That's what pytest provides these configuration settings for. What I would not mind doing, is adding extra decorators to those few Playwright tests (they are a minority in my code base, so adding extras is manageable). Also, if playwright-pytest(-asyncio) does not play well with pytest's built-in configuration, then that's a pretty damning first impression if enabling playwright-pytest-asyncio causes every other non-Playwright test to fail. Something that is ideally avoided. E.g. it would look better if the Playwright tests fail (because that's literally what a developer would be in the process of setting up) than to make it look like the setup broke existing code (which would be much more confusing, and potentially harder to work around).
I'm not sure what you mean by "it" in this question. Having a function-scoped event loop is the default in pytest-asyncio as it provides the most isolation between tests, so out of all the options it's the one most likely to work. However, it does not work with pytest-playwright-asyncio. I was unable to find where Playwright's Pytest fixtures are defined. Could you point me in the right direction? |
Definitely! Thats why we didn't release it yet. One thing to note is that the
Playwright would like to re-use the Playwright instance, so we need a loop which is session wide - I think there is no way around that. Either via setting it globally via the
pytest-playwright-asyncio fixtures are defined here: https://github.com/microsoft/playwright-pytest/blob/main/pytest-playwright-asyncio/pytest_playwright_asyncio/pytest_playwright.py |
I use
|
We published PyPi: https://pypi.org/project/pytest-playwright-asyncio/ Docs will follow. |
Thank you all for making this work! I am about to merge the PR that implements all this in my own project. Being able to use Python instead of JS/TS with Playwright's own test runner saves a lot of code duplication and makes writing tests a lot easier. I did run into the problem that if run as part of the main pytest test suite of ~4500 tests, these Playwright tests would hang indefinitely. I did not manage to trace the source of the problem (it could be an event loop issue). However, I worked around it by running the Playwright tests separately from the main suite. There are many ways to do this, but I opted to organize my Playwright tests in a separate root test directory, yet inherit from the main test suite's pytest configuration ( |
I also migrated to For anyone also running into tests hanging indefinitely: apparently we really have to put all tests in the same loop. As far as I understand, this is at least because Playwright's |
I need to run
aiohttp
server and useplaywright
in tests at the same time.Am I right that
pytest-playwright
right now can't help me with that?It provides fixtures only for sync API. But I need async API.
So I have to do something like that.
The text was updated successfully, but these errors were encountered: