1

我能够在 Selenium WebDriver 会话中调用 Chrome 远程接口功能(Page.captureScreenshot、Emulation.clearDeviceMetricsOverride 等)。但是我在调​​用适用于 DOM 元素的方法时遇到问题。问题出在 nodeId 参数上。例如,此函数https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-setFileInputFiles接受作为参数之一的 nodeId。我不知道如何从 SeleniumWebdriver 中提取基于 IWebElement(或 RemoteWebElement)的 nodeId。

如何使用 Selenium 或 Javascript 找到 nodeId?

有关 Chrome 远程接口的更多信息可以在这里找到https://chromedevtools.github.io/devtools-protocol/

4

1 回答 1

2

我在这里找到了关于 devtools-protocol 问题跟踪器的答案https://github.com/ChromeDevTools/devtools-protocol/issues/66

完整的工作解决方案可以在这里找到: https ://github.com/cezarypiatek/Tellurium/blob/master/Src/MvcPages/SeleniumUtils/ChromeRemoteInterface/ChromeRemoteInterface.cs

private long GetChromeNodeId(IWebElement inputElement)
{
    driver.ExecuteScript(@"(function(fileInput){
        window.__tellurium_chromerinode = fileInput;
    })(arguments[0])", inputElement);


    var evaluateResponse = SendCommand("Runtime.evaluate", new Dictionary<string, object>
    {
        ["expression"] = "window.__tellurium_chromerinode"
    });

    driver.ExecuteScript(@"(function(fileInput){
        delete window.__tellurium_chromerinode;
    })()");

    var remoteObjectId = evaluateResponse.GetValue<string>("result.objectId");

    var rquestNodeResponse = SendCommand("DOM.requestNode", new Dictionary<string, object>
    {
        ["objectId"] = remoteObjectId
    });

    return rquestNodeResponse.GetValue<long>("nodeId");
}
于 2017-11-08T22:42:31.320 回答