Groovy 给出 "No such Property" 但它在方法中声明:selenium 和页面对象建模

Groovy gives "No such Property" but its declared in the method: selenium and page object modelling

我正在尝试一种使用硒的新方法。以前我使用 soapui 作为 IDE,我正在转向 intellij。在真实的 IDE 上工作有点不同,我不明白我做错了什么。我认为这与 What are 'properties' in Groovy?

有关

下面是我的页面

package pages

import org.openqa.selenium.By
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement

class homePage{
    WebDriver driver
    homePage(WebDriver driver){
        this.driver=driver
    }
    By openLogin=By.cssSelector("#mainLoginBtn")
    By user=By.cssSelector("#userId")
    By pin =By.cssSelector("#password")
    By go = By.cssSelector("#loginBtn")

    WebElement loginBox(){
        return driver.findElement(openLogin)
    }
    WebElement pin(){
        return driver.findElement(pin)
    }
    WebElement userName(){
        return driver.findElement(user)
    }
    WebElement submitLogin(){
        return  driver.findElement(go)
    }
}

下面是我的测试用例:

package tests

import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.testng.annotations.AfterTest
import org.testng.annotations.BeforeTest
import org.testng.annotations.Test
import pages.homePage

class login{
    private static final Logger log = LogManager.getLogger(login)
    WebDriver driver

    @BeforeTest
    void setup(){
        System.setProperty("webdriver.chrome.driver","c:\drivers\chromedriver.exe")
        WebDriver driver = new ChromeDriver()
        driver.get("https://somewebsite")
    }

    @Test
    void login2(){
        homePage Home = new homePage(driver)
        Home.loginBox().click()
        Home.userName().sendKeys("user")
        Home.pin().sendKeys("user")
        Home.submitLogin().click()
        log.info "it worked"
    }
    @AfterTest
    void kill(){
        driver.close()
        driver.quit()
    }
}

因此,当我 运行 login2() 时,驱动程序打开所述站点并立即给我 groovy.lang.MissingPropertyException: No such property: Home for class: tests.login 错误。它在方法中,我做错了什么?

我尝试在方法外添加 homePage Home 无济于事。我不确定它是否有帮助,但这是我的 gradle 文件:

plugins {
    id 'groovy'
}

group 'someRandomName'
version '1.0-SNAPSHOT'

repositories {
    maven { url 'http://repo1.maven.org/maven2' }
}
ext {
    seleniumVersion = '3.141.59'
}
test {
    useTestNG()
}
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile group: 'org.testng', name: 'testng', version: '7.0.0'
    testCompile "org.seleniumhq.selenium:selenium-support:${seleniumVersion}"
    testCompile group: 'io.appium', name: 'java-client', version: '7.2.0'
    testCompile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: "${seleniumVersion}"
    testCompile group: 'org.seleniumhq.selenium', name: 'selenium-server', version: "${seleniumVersion}"
    testCompile group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version: "${seleniumVersion}"
    testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.12.1'
    testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.12.1'
}

这与你的大小写有关。 Class 名称应以大写字母开头。确定调用方法和声明变量之间的区别是语法的一部分。

class HomePage {}
HomePage home = new HomePage() // conventional
class HomePage {}
HomePage Home = new HomePage() // fine, but not conventional
class homePage {}
homePage Home = new homePage() // error - the grammar reads this as a method call:
                               // this.homePage(Home = new homePage())
// again demonstrating that this is a method call syntax
class homePage {}
public void homePage(def a) { println a + "456" } 
def Home;
homePage Home = 123 // prints 123456, same as this.homePage(Home = 123)
assert Home == 123
class homePage {}
new homePage() // fine apparently...
class homePage {}
homePage h; // ... the error is on the variable declaration part