问题

在使用playwright自带的wait_for_load_state()方法来进行等待的时候,遇到异步的接口请求就会导致一直等待接口的返回,或者不等待的情况。

解决思路

在 Playwright Python 中,可以通过page.on()方法来监听网络请求和响应,等待与点击操作相关的所有接口请求加载完毕。

代码实现

1.设置一个空的 Set 用于存储所有未完成的请求,如果页面有图片加载也可以通过url的尾缀进行过滤

# 设置一个空的 Set 用于存储所有未完成的请求
pending_requests = set()

def request_started(self, request):
# 当新请求开始时,将其添加到 pending_requests
pending_requests.add(request)

def request_finished(self, request):
# 当请求结束时,将其从 pending_requests 中移除
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())