Selenium на Kotlin | Koltin
Пытаюсь разобраться с Selenium на Koltin. Мне нужно написать парсер, но проблема в том, что ресурс работает динамически (через скрипты), поэтому мне порекомендовали использовать Selenium, но что-то ничего не получается.
Важно! Я пишу мобильное приложение, поэтому не могу указать путь на своем диске, ведь при компиляции он потеряется. (моё предположение, но могу и ошибаться)
Подключил зависимости через Android Studio Project Structure:
implementation 'org.seleniumhq.selenium:selenium:2.0rc2'
Подключил плагин WebDriver по рекомендации с форумов:
apply plugin: 'com.github.erdi.webdriver-binaries' //in Module:app <
//in dependencies Project: name >
classpath("gradle.plugin.com.github.erdi.webdriver-binaries:webdriver-binaries-gradle-plugin:2.3")
//in repositories Project: name >
maven {
url = uri("https://plugins.gradle.org/m2/")
}
Пытаюсь взаимодействовать с сайтом:
val driver = ChromeDriver()
driver.get("https://xn--80ac9aeh6f.xn--p1ai/books?order=new")
waitUntilPageIsReady(driver)
val links = driver.findElementsByClassName("BookListItem__title-link")
.map { it.getAttribute("href") }
links.forEach {
Log.i("SeleniumIO", "$it is link?")
}
private fun waitUntilPageIsReady (driver: ChromeDriver) {
val executor = driver as JavascriptExecutor
WebDriverWait (driver, 1)
.until { executor.executeScript ( "return document.readyState" ) == "complete"}
}
Обновлено
Компиляция приложения происходит успешно, но при запуске все падает и выдает ошибку:
The path to the chromedriver executable must be set by the webdriver.chrome.driver system property
Ответы (1 шт):
Укажите путь к драйверу в set properties, пример из боевого проекта
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.remote.CapabilityType
import java.io.File
import java.nio.file.Paths
import java.util.logging.Level
fun chromeDriverInit(): ChromeDriver {
System.setProperty("webdriver.chrome.driver", Paths.get("chrome-driver/chromedriver-94.exe").toAbsolutePath().toString())
val chromePrefs = HashMap<String, Any>()
val downloadPath = File("downloads").absolutePath
chromePrefs["download.default_directory"] = downloadPath
val driver = chromeDriver(chromeOptions(false) {
setExperimentalOption("prefs", chromePrefs)
setCapability("downloadPath", downloadPath)
setCapability(ChromeOptions.CAPABILITY, this)
setCapability(CapabilityType.ACCEPT_SSL_CERTS, true)
setAcceptInsecureCerts(true)
setCapability("networkConnectionEnabled", true)
setPageLoadStrategy(PageLoadStrategy.NORMAL)
})
driver.capabilities.getCapability("networkConnectionEnabled").let { println("networkConnectionEnabled ===: $it") }
driver.setLogLevel(Level.ALL)
try {
driver.get("https://")
driver.manage().run {
addCookie(cookie("token", "LhHL+mCvsy", "site.ru", "/", "2024.02.21T17:56:33", true, false))
addCookie(
cookie(
"mutoken",
"znA7DNWJ47NgLte5gxk1IDYE6X3y7uT5x2jC9zwm4jPndk3lWjhAWLFUzlT9m0R",
"site.ru",
"/",
"05.08.2023, 13:12:58",
true,
true
)
) // sameSite = lax
}
} catch (e: Exception) {
println(e.localizedMessage)
}
return driver
}