Почему я не могу использовать переменную? [Котлинский] - PullRequest
1 голос
/ 04 февраля 2020

Я Java разработчик, который только что переключился на Kotlin, и я еще не полностью понял его. Я не могу понять, почему я не могу использовать свой объект в других методах в моем следующем коде ..? Я использую kotlin на IntelliJ в сочетании с селнеем (что на самом деле не должно иметь значение, не так ли?) Я попытался вывести его из метода init, но это тоже не сработало ... Заранее спасибо.

import org.openqa.selenium.By
import org.openqa.selenium.chrome.ChromeDriver

class MapsDriver()
{

    init {
        var obj : ChromeDriver = ChromeDriver()
    }

    fun convertToGmURL(string : String) : String{
        var string_trimmed : String = ""
        string.forEach {
            if(it == ' '){
                string_trimmed += "+"
            }
            else{
                string_trimmed += it
            }
        }
        return string_trimmed
    }

    fun searchMaps(search : String){

        val searchConverted : String  = convertToGmURL(search)

        obj.get("https://www.google.com/maps/search/?api=1&query=$searchConverted")

    }

    fun getXpath(Xpath : String) : String{
        loop@while(true) {
            try {
                var result = obj.findElementByXPath(Xpath)
                return result.text
            }
            catch (NoSuchElementException : Exception){
                continue@loop
            }
        }
    }

    fun getResultName(resultNumber : Int) : String{
        val convertedIndex : Int = (resultNumber * 2) + 1
        var result : String = getXpath("//*[@id=\"pane\"]/div/div[1]/div/div/div[4]/div[1]/div[$convertedIndex]/div[1]/div[1]/div[1]/div[2]/h3/span")
        return result
    }

    fun getAllResults(){
        Thread.sleep(1_000)
        val amountIndexes = getXpath("//*[@id=\"pane\"]/div/div[1]/div/div/div[4]/div[2]/div/div[1]/span/span[2]")
        val amountIndexesInt : Int = amountIndexes.toInt()
        val resultsName : Array<String> = Array(amountIndexesInt){getResultName(it)}

        resultsName.forEach { println(it) }
    }

}

fun main(){
    System.setProperty("webdriver.chrome.driver", "/home/josef/Java/cdriver/chromedriver")
    val md : MapsDriver = MapsDriver()
    md.searchMaps("Autohaus Muenchen")
    md.getAllResults()
}

1 Ответ

2 голосов
/ 04 февраля 2020

Проблема в том, что obj является локальной переменной для метода init, поэтому она эквивалентна следующему коду Java:

class MapsDriver {
    public MapsDriver() {
        ChromeDriver obj = new ChromeDriver();
        // you can't use obj anywhere else as it's local to the constructor
    }
}

Если вы хотите, чтобы obj был переменная экземпляра, тогда вы должны сделать что-то вроде:

class MapsDriver {
    private val obj = ChromeDriver() // instance variable, no need for init block in this case
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...