问题
在使用playwright自带的wait_for_load_state()方法来进行等待的时候,遇到异步的接口请求就会导致一直等待接口的返回,或者不等待的情况。
解决思路
在 Playwright Python 中,可以通过page.on()方法来监听网络请求和响应,等待与点击操作相关的所有接口请求加载完毕。
代码实现
1.设置一个空的 Set 用于存储所有未完成的请求,如果页面有图片加载也可以通过url的尾缀进行过滤
pending_requests = set() def request_started(self, request): pending_requests.add(request) def request_finished(self, request): pending_requests.discard(request)
|
2. 监听 page 的请求开始和结束事件
def _register_request(self): self.page.on("request", self._request_started) self.page.on("requestfinished", self._request_finished) self.page.on("requestfailed", self._request_finished)
|
3.编写一个异步等待,并且设置一个超时时间
async def request_wait(self, time_out=2): start_time = time.time() while len(self.pending_requests) > 0: await asyncio.sleep(0.1) if time.time() - start_time > time_out: self.pending_requests.clear() return return async def run_async(self): done, pending = await asyncio.wait([asyncio.create_task(self.request_wait())])
|
4. 因为asyncio无法在循环里面所以我们需要使用nest_asyncio来进行调用
import nest_asyncio nest_asyncio.apply()
asyncio.get_event_loop().run_until_complete(self.run_async())
|