Groovy выдает «Нет такого свойства», но оно объявлено в методе: моделирование селена и объекта страницы - PullRequest
1 голос
/ 26 сентября 2019

Я пробую новый способ работы с селеном.Ранее я использовал soapui в качестве IDE и перехожу к intellij.В реальной IDE все немного по-другому, и я не понимаю, что я делаю неправильно.Я думаю, что это как-то связано с Что такое 'свойства' в 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'
}

1 Ответ

1 голос
/ 27 сентября 2019

Это связано с вашей капитализацией.Имена классов должны начинаться с верхнего регистра.Это часть грамматики, определяющая разницу между вызовом метода и объявлением переменной.

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
...