因此,使用Chrome 63,现在支持多客户端远程调试(https://developers.google.com/web/updates/2017/10/devtools-release-notes)
我想要实现的是使用Chrome DevTools协议HeapProfiler和一些硒测试。我正在运行64版Chrome开发者频道和ChromeDriver 2.33。
ChromeOptions options = newChromeOptions();
options.addArguments("--remote-debugging-port=9222");
WebDriver driver = new ChromeDriver(options);
... selenium stuff
新的镀铬窗口将打开并挂起,直到超时。我可以通过帮助>确认打开的镀铬窗口是铬64。关于谷歌浏览器检查版本。 我收到此错误,似乎是webdriver丢失连接。
Exception in thread "main" org.openqa.selenium.WebDriverException: chrome not
reachable
DevTools协议正在运行,因为我可以在另一个chrome窗口中打开http://localhost:9222并查看调试界面。
有没有人能够让这两件事一起工作?
谢谢:)
答案 0 :(得分:3)
这里的问题是,如果你通过“remote-debugging-port”开关,那么chromedriver有一个错误,它仍然在内部分配一个randon端口并继续尝试连接到它而不是连接到9222端口。
options.addArguments( “ - 远程调试端口= 9222”);
我们可以通过跳过此命令开关来解决此问题,让chrome决定此随机端口并从chromedriver日志中提取此端口号。
我做到了,在这里我已经详细地写了博客。
答案 1 :(得分:0)
我这样做是为了获取remotedebugging nd所需的信息,以防止定义端口。我通过SeleniumLog-API获取它
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
ChromeOptions options = new ChromeOptions();
options.setBinary(chromeBin);
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
LoggingPreferences logPref = new LoggingPreferences();
logPref.enable(LogType.DRIVER, Level.ALL);
driverInstance = new ChromeDriver(capabilities);
LogEntries x = driverInstance.manage().logs().get(LogType.DRIVER);
for(LogEntry e:x.getAll()){
if(e.getMessage().contains("DevTools request:")){
String url = e.getMessage().replaceFirst("DevTools request:", "").trim();
}
if(e.getMessage().contains("DevTools response:")){
String json = e.getMessage().replaceFirst("DevTools response:", "");
try {
if("page".equals(JSONUtil.get(json,"type" ))){
webSocketDebuggerUrl = JSONUtil.get(json,"webSocketDebuggerUrl" );
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
System.out.println(e.getMessage());
}
我使用的JSONUtil是我自己的工具,所以不要怀疑,只需替换为从jsontext中提取的代码。
答案 2 :(得分:0)
在Java中,使用与硒3.13和cdp4j 3.0.2-SNAPSHOT相同的目标选项卡,这是一个相当健壮的实现。轻松翻译成任何语言。
package com.company;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import io.webfolder.cdp.session.SessionFactory;
import org.openqa.selenium.HasCapabilities;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, "C:\\path\\to\\chromedriver.exe");
var driver = new ChromeDriver();
try {
var cdp = findCdpEndpoint(driver);
System.out.println(cdp.toString());
try (var factory = new SessionFactory(cdp.getPort())) {
driver.navigate().to("https://google.com");
String seTargetId = getSeTargetId(cdp, driver.getTitle());
try (var session = factory.connect(seTargetId)) {
session.waitDocumentReady();
session.sendKeys("Astronauts");
driver.getKeyboard().sendKeys(Keys.RETURN);
session.wait(2000);
driver.navigate().to("http://www.google.com");
session.waitDocumentReady();
}
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
driver.quit();
}
private static String getSeTargetId(URL cdp, String title) throws IOException {
for (JsonElement element : new JsonParser().parse(new InputStreamReader(cdp.openStream(), "UTF-8")).getAsJsonArray()) {
var object = element.getAsJsonObject();
if (title == null || title.isEmpty()
? object.get("type").getAsString().equalsIgnoreCase("page")
: object.get("title").getAsString().equalsIgnoreCase(title)) {
return object.get("id").getAsString();
}
}
throw new IllegalStateException("Selenium target not found.");
}
private static URL findCdpEndpoint(WebDriver driver) throws IOException {
var capChrome = (Map<?,?>) ((HasCapabilities)driver).getCapabilities().getCapability("chrome");
var userDataDir = (String) capChrome.get("userDataDir");
var port = Integer.parseInt(Files.readAllLines(Paths.get(userDataDir, "DevToolsActivePort")).get(0));
return new URL("http", "localhost", port, "/json");
}
}
答案 3 :(得分:0)
Selenium 4发行版将具有适用于Chrome DevTools协议的用户友好API。我刚刚为Selenium Java客户端实现了网络和性能域。 https://github.com/SeleniumHQ/selenium/pull/7212
此外,Java客户端中的所有域都有一个通用API,该API早已合并。所有这些新功能都可能会在下一个Alpha版本中发布。
这是一篇有关如何使用Log的不错的文章: https://codoid.com/selenium-4-chrome-devtools-log-entry-listeners/