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
我正在尝试一种使用硒的新方法。以前我使用 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