"""Link previews: a page with OpenGraph tags and a direct picture link.""" import asyncio, functools, http.server, os, shutil, tempfile, threading from playwright.async_api import async_playwright from browser import login, BASE, OUT HERE = os.path.dirname(os.path.abspath(__file__)) PORT = 8765 PAGE = """ Fallback title Hello""" def serve(): root = tempfile.mkdtemp() with open(os.path.join(root, "article.html"), "w") as f: f.write(PAGE) shutil.copy(os.path.join(HERE, "test.png"), os.path.join(root, "test.png")) handler = functools.partial(http.server.SimpleHTTPRequestHandler, directory=root) server = http.server.ThreadingHTTPServer(("127.0.0.1", PORT), handler) threading.Thread(target=server.serve_forever, daemon=True).start() return server async def main(): server = serve() async with async_playwright() as p: browser = await p.chromium.launch() _, alice, aerr = await login(browser, "alice@localhost", "alicepass", "previewalice") _, bob, berr = await login(browser, "bob@localhost", "bobpass", "previewbob") await alice.goto(BASE + "/chat/bob@localhost") await alice.wait_for_selector("#chat_textarea", timeout=15000) await bob.goto(BASE + "/chat/alice@localhost") await bob.wait_for_selector("#chat_textarea", timeout=15000) await bob.wait_for_timeout(1500) for text in (f"Have a look http://127.0.0.1:{PORT}/article.html", f"http://127.0.0.1:{PORT}/test.png"): await bob.fill("#chat_textarea", text) await bob.press("#chat_textarea", "Enter") await bob.wait_for_timeout(1500) await alice.wait_for_timeout(4000) for name, page in (("alice", alice), ("bob", bob)): await page.screenshot(path=f"{OUT}/preview_{name}.png") cards = await page.locator("#chat_widget ul.list.card").all_inner_texts() pictures = await page.locator("#chat_widget div.bubble img").count() print(name, "cards:", [c.replace("\n", " | ")[:120] for c in cards[-2:]], "pictures:", pictures) for e in aerr + berr: print(e) await browser.close() server.shutdown() asyncio.run(main())