Для загрузки файла вы должны использовать элемент input
с типом файла, но ваш селектор pick-files
- это div
, поэтому вы получили ошибку. Используйте селектор input[type=file]
CSS:
public class FileUploadPopUp {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "G://ChromeDriver//chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("https://pdf2doc.com/");
driver.findElement(By.cssSelector("input[type=file]")).sendKeys("F:\\Selenium Complete Notes.pdf");
}
}
Создайте фабрику SSLSocket
самостоятельно и установите ее на HttpsURLConnection
перед подключением.
...
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslFactory);
conn.setMethod("POST");
...
You ' я захочу создать один SSLSocketFactory
и сохранить его. Вот набросок его инициализации:
/* Load the keyStore that includes self-signed cert as a "trusted" entry. */
KeyStore keyStore = ...
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
sslFactory = ctx.getSocketFactory();
Если вам нужна помощь в создании хранилища ключей, прокомментируйте.
Вот пример загрузки хранилища ключей:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(trustStore, trustStorePassword);
trustStore.close();
Чтобы создать хранилище ключей с сертификатом в формате PEM, вы можете написать свой собственный код, используя CertificateFactory
, или просто импортировать его с помощью keytool
из JDK (keytool не будет работать для «ключевой записи», но вполне подходит для «доверенной записи»).
keytool -import -file selfsigned.pem -alias server -keystore server.jks
Мы копируем хранилище доверенных сертификатов JRE и добавляем наши настраиваемые сертификаты в это хранилище доверенных сертификатов, а затем говорим приложению использовать настраиваемое хранилище доверенных сертификатов с системным свойством. Таким образом, мы оставляем хранилище доверенных сертификатов JRE по умолчанию в покое.
Обратной стороной является то, что при обновлении JRE новое хранилище доверенных сертификатов не объединяется с вашим пользовательским.
Возможно, вы могли бы справиться с этим сценарием, используя программу установки или запуск, которая проверяет хранилище доверенных сертификатов / jdk и проверяет наличие несоответствия или автоматически обновляет хранилище доверенных сертификатов. Я не знаю, что произойдет, если вы обновите хранилище доверенных сертификатов во время работы приложения.
Это решение не на 100% элегантно или надежно, но оно простое, работает и не требует кода.
Мне пришлось сделать что-то подобное, когда я использовал commons-httpclient для доступа к внутреннему https-серверу с самозаверяющим сертификатом. Да, наше решение заключалось в создании настраиваемого TrustManager, который просто передавал все (регистрируя сообщение отладки).
Это сводится к наличию нашей собственной SSLSocketFactory, которая создает сокеты SSL из нашего локального SSLContext, который настроен так, чтобы иметь только наши локальные TrustManager, связанный с ним. Ты не Мне вообще не нужно находиться рядом с хранилищем ключей / сертификатом.
Итак, это находится в нашей LocalSSLSocketFactory:
static {
try {
SSL_CONTEXT = SSLContext.getInstance("SSL");
SSL_CONTEXT.init(null, new TrustManager[] { new LocalSSLTrustManager() }, null);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Unable to initialise SSL context", e);
} catch (KeyManagementException e) {
throw new RuntimeException("Unable to initialise SSL context", e);
}
}
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
LOG.trace("createSocket(host => {}, port => {})", new Object[] { host, new Integer(port) });
return SSL_CONTEXT.getSocketFactory().createSocket(host, port);
}
Наряду с другими методами, реализующими SecureProtocolSocketFactory. LocalSSLTrustManager - это вышеупомянутая фиктивная реализация диспетчера доверия.