【发布时间】:2020-01-03 16:43:23
【问题描述】:
我有一种情况,webdriver 对象隐藏在依赖项目的包装器中,我只能以字符串格式检索 会话 id 并从这些函数返回 driver.manage()/cookies。
现在我正在尝试使用此会话 ID 并将其传递给我的 webdriver 引用变量,以便我可以扩展我的要求。
我还找到了与以下相同的参考:
https://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/
我试过了,但出现如下错误:
线程“主”org.openqa.selenium.json.JsonException 中的异常: 无法从以下位置确定类型:
带有 cookie 的代码:
public static void main(String[] args) throws URISyntaxException, MalformedURLException {
WebDriver driver = null;
//WebDriverManager.chromedriver().setup();
WebDriverManager.chromedriver().version(Configuration.getConfigurationValueForProperty("chrome-version"))
.setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("enable-automation");
// options.addArguments("--headless");
options.addArguments("--no-sandbox");
options.addArguments("--disable-infobars");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--disable-browser-side-navigation");
options.addArguments("--disable-gpu");
driver = new ChromeDriver(options);
driver.get(Configuration.applicationUnderTestURL());
Set<Cookie> name =driver.manage().getCookies();
WebDriver driver3 = null;
for(Cookie test: name)
{
driver3.manage().addCookie(test);
}
driver3.get("https://stackoverflow.com/questions/8638241/setting-cookie-through-foreach-loop-inside-while-loop");
}
我尝试使用会话 ID 的演示代码:
package stepdef;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Collections;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.Command;
import org.openqa.selenium.remote.CommandExecutor;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.HttpCommandExecutor;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.Response;
import org.openqa.selenium.remote.SessionId;
import org.openqa.selenium.remote.http.W3CHttpCommandCodec;
import org.openqa.selenium.remote.http.W3CHttpResponseCodec;
import automationframework.Configuration;
import io.github.bonigarcia.wdm.WebDriverManager;
public class testing {
public static void main(String[] args) throws URISyntaxException, MalformedURLException {
WebDriver driver = null;
//WebDriverManager.chromedriver().setup();
WebDriverManager.chromedriver().version(Configuration.getConfigurationValueForProperty("chrome-version"))
.setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("enable-automation");
// options.addArguments("--headless");
options.addArguments("--no-sandbox");
options.addArguments("--disable-infobars");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--disable-browser-side-navigation");
options.addArguments("--disable-gpu");
driver = new ChromeDriver(options);
driver.get(Configuration.applicationUnderTestURL());
SessionId session = ((ChromeDriver)driver).getSessionId();
String session2 = session.toString();
System.out.println(session2);
String str = "http://google.com"; // just passing random URL as I have only session id
URI uri = new URI(str);
URL url = uri.toURL();
RemoteWebDriver driver2 = createDriverFromSession(session, url);
driver2.get("http://tarunlalwani.com"); // here I am getting error where I need to resue the existing browser using session id
}
public static RemoteWebDriver createDriverFromSession(final SessionId sessionId, URL command_executor){
CommandExecutor executor = new HttpCommandExecutor(command_executor) {
@Override
public Response execute(Command command) throws IOException {
Response response = null;
if (command.getName() == "newSession") {
response = new Response();
response.setSessionId(sessionId.toString());
response.setStatus(0);
response.setValue(Collections.<String, String>emptyMap());
try {
Field commandCodec = null;
commandCodec = this.getClass().getSuperclass().getDeclaredField("commandCodec");
commandCodec.setAccessible(true);
commandCodec.set(this, new W3CHttpCommandCodec());
Field responseCodec = null;
responseCodec = this.getClass().getSuperclass().getDeclaredField("responseCodec");
responseCodec.setAccessible(true);
responseCodec.set(this, new W3CHttpResponseCodec());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
response = super.execute(command);
}
return response;
}
};
return new RemoteWebDriver(executor, new DesiredCapabilities());
}
}
请告诉我是否可能或任何方式
【问题讨论】:
-
哪一行抛出异常?
-
driver2.get("tarunlalwani.com"); 这一行
-
我也有 cookie .. 我也可以从现有 cookie 创建 Webdriver 引用吗?
-
我想你可以。您可以创建一个
WebDriver实例,然后加载现有的 cookie。从那里,您可能能够访问该网站,就像您使用与以前相同的浏览器一样。作为参考,this 已在 Python 中完成 -
我也添加了该代码,但它抛出空错误
标签: java selenium selenium-webdriver selenium-chromedriver