From 4ace9f0bcca3fdd7a5213ae3fe8081067954afb8 Mon Sep 17 00:00:00 2001 From: fanyong920 <1023079644@qq.com> Date: Wed, 18 Dec 2024 19:48:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Page.waitForSelector=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=20aria=20selector=20=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruiyun/jvppeteer/api/core/Frame.java | 2 +- .../jvppeteer/cdp/core/CdpElementHandle.java | 3 ++- .../jvppeteer/cdp/core/CdpJSHandle.java | 20 +++++++++++++++++++ .../jvppeteer/cdp/core/ExecutionContext.java | 2 +- .../jvppeteer/cdp/entities/Binding.java | 20 ++++++++++--------- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ruiyun/jvppeteer/api/core/Frame.java b/src/main/java/com/ruiyun/jvppeteer/api/core/Frame.java index 596e87b..93fa5e0 100644 --- a/src/main/java/com/ruiyun/jvppeteer/api/core/Frame.java +++ b/src/main/java/com/ruiyun/jvppeteer/api/core/Frame.java @@ -281,7 +281,7 @@ public Object evaluate(String pptrFunction, List args) throws JsonProces public ElementHandle waitForSelector(String selector, WaitForSelectorOptions options) { QuerySelector querySelector = QueryHandlerUtil.getQueryHandlerAndSelector(selector); options.setPolling(querySelector.getPolling()); - return querySelector.getQueryHandler().waitFor(this, selector, options); + return querySelector.getQueryHandler().waitFor(this, querySelector.getUpdatedSelector(), options); } /** diff --git a/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpElementHandle.java b/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpElementHandle.java index c046804..ff5a475 100644 --- a/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpElementHandle.java +++ b/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpElementHandle.java @@ -40,6 +40,7 @@ public class CdpElementHandle extends ElementHandle { private static final Set NON_ELEMENT_NODE_ROLES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("StaticText", "InlineTextBox"))); private Integer backendNodeId; + CdpElementHandle(IsolatedWorld world, RemoteObject remoteObject) { super(new CdpJSHandle(world, remoteObject)); } @@ -143,7 +144,7 @@ public void autofill(AutofillData data) { @Override public int backendNodeId() { - if(Objects.nonNull(this.backendNodeId)){ + if (Objects.nonNull(this.backendNodeId)) { return this.backendNodeId; } try { diff --git a/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpJSHandle.java b/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpJSHandle.java index 1714630..716bda5 100644 --- a/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpJSHandle.java +++ b/src/main/java/com/ruiyun/jvppeteer/cdp/core/CdpJSHandle.java @@ -1,16 +1,21 @@ package com.ruiyun.jvppeteer.cdp.core; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.ruiyun.jvppeteer.api.core.CDPSession; import com.ruiyun.jvppeteer.api.core.ElementHandle; import com.ruiyun.jvppeteer.api.core.JSHandle; import com.ruiyun.jvppeteer.api.core.Realm; import com.ruiyun.jvppeteer.cdp.entities.RemoteObject; +import com.ruiyun.jvppeteer.common.Constant; import com.ruiyun.jvppeteer.exception.EvaluateException; import com.ruiyun.jvppeteer.exception.JvppeteerException; import com.ruiyun.jvppeteer.util.Helper; import com.ruiyun.jvppeteer.util.StringUtil; import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; /** * 表示对 JavaScript 对象的引用。可以使用 Page.evaluateHandle() 创建实例。 @@ -36,6 +41,21 @@ public boolean disposed() { return disposed; } + @Override + public Map getProperties() throws JsonProcessingException { + JsonNode response = this.client().send("Runtime.getProperties", Constant.OBJECTMAPPER.createObjectNode().put("objectId", this.remoteObject.getObjectId()).put("ownProperties", true)); + Map result = new LinkedHashMap<>(); + Iterator iterator = response.get(Constant.RESULT).iterator(); + while (iterator.hasNext()) { + JsonNode property = iterator.next(); + if (!property.get("enumerable").asBoolean() || !property.hasNonNull("value")) { + continue; + } + result.put(property.get("name").asText(), this.world.createJSHandle(Constant.OBJECTMAPPER.treeToValue(property.get("value"), RemoteObject.class))); + } + return result; + } + @Override public Realm realm() { return this.world; diff --git a/src/main/java/com/ruiyun/jvppeteer/cdp/core/ExecutionContext.java b/src/main/java/com/ruiyun/jvppeteer/cdp/core/ExecutionContext.java index 72b775a..4db55ec 100644 --- a/src/main/java/com/ruiyun/jvppeteer/cdp/core/ExecutionContext.java +++ b/src/main/java/com/ruiyun/jvppeteer/cdp/core/ExecutionContext.java @@ -403,7 +403,7 @@ private JsonNode convertArgument(ExecutionContext context, Object arg) { objectNode.put("unserializableValue", NaN); return objectNode; } - CdpJSHandle objectHandle = arg instanceof CdpJSHandle ? (CdpJSHandle) arg : null; + JSHandle objectHandle = arg instanceof JSHandle ? (JSHandle) arg : null; if (objectHandle != null) { if (objectHandle.realm() != context.world()) { throw new JvppeteerException("JSHandles can be evaluated only in the context they were created!"); diff --git a/src/main/java/com/ruiyun/jvppeteer/cdp/entities/Binding.java b/src/main/java/com/ruiyun/jvppeteer/cdp/entities/Binding.java index 5065b63..f2e985f 100644 --- a/src/main/java/com/ruiyun/jvppeteer/cdp/entities/Binding.java +++ b/src/main/java/com/ruiyun/jvppeteer/cdp/entities/Binding.java @@ -1,13 +1,14 @@ package com.ruiyun.jvppeteer.cdp.entities; import com.ruiyun.jvppeteer.api.core.JSHandle; -import com.ruiyun.jvppeteer.common.BindingFunction; -import com.ruiyun.jvppeteer.cdp.core.CdpJSHandle; import com.ruiyun.jvppeteer.cdp.core.ExecutionContext; +import com.ruiyun.jvppeteer.common.BindingFunction; import com.ruiyun.jvppeteer.exception.EvaluateException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,16 +44,16 @@ public void run(ExecutionContext context, int id, List args, boolean isT " }", params); try { Map properties = handles.getProperties(); + AtomicInteger count = new AtomicInteger(); properties.forEach((key, handle) -> { - if (args.contains(key)) { - if (handle.remoteObject().getSubtype().equals("node")) { - args.set(Integer.parseInt(key), handle); + if (count.get() <= args.size()) { + if (Objects.equals(handle.remoteObject().getSubtype(), "node")) { + args.set(count.get(), handle); } else { handle.dispose(); } - } else { - handle.dispose(); } + count.getAndIncrement(); }); } finally { if (handles != null) { @@ -72,11 +73,12 @@ public void run(ExecutionContext context, int id, List args, boolean isT " }", params); for (Object arg : args) { - if (arg instanceof CdpJSHandle) { - ((CdpJSHandle) arg).dispose(); + if (arg instanceof JSHandle) { + ((JSHandle) arg).dispose(); } } } catch (Exception e) { + LOGGER.error("jvppeteer error: ", e); if (e instanceof EvaluateException) { try { List params = new ArrayList<>();