首页 > 解决方案 > 为什么我不能使用变量?[科特林]

问题描述

我是一名刚切换到 Kotlin 的 Java 开发人员,但我还没有完全理解它。我不明白为什么我不能在以下代码中的其他方法中使用我的 obj ..?我在 IntelliJ 上将 kotlin 与 selneium 结合使用(这不应该真的有什么不同,应该吗?)我尝试将它从 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()
}

标签: seleniumkotlin

解决方案


问题在于它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
    ...
}

推荐阅读