使用Selenium Java和PageFactory

时间:2017-07-25 02:48:31

标签: javascript java selenium selenium-webdriver automation

我在selenium中使用页面工厂来识别元素。我无法理解硒的奇怪行为的一个这样的案例就在这里

dateOfBirth
passportExpiry
driverLicence--- are the WebElements defined using pageFactory

1. driverLicence.findElement(By.xpath("//div[@id='day-region']//div/span/a[text()='01']")).click();

 2. passportExpiry.findElement(By.xpath("//div[@id='day-region']//div/span/a[text()='01']")).click();

 3. dateOfBirth.findElement(By.xpath("//div[@id='day-region']//div/span/a[text()='01']")).click();

如果我们观察上面的3行,就会有一个类似的模式,其中只需要将webElement作为参数发送。看起来如下所示并且每次都重复使用

public void selectDay(WebElement we) {     we.findElement(By.xpath("//div[@id='day-}region']//div/span/a[text()='01']")).c
 lick();
}

selectDay(dateOfBirth);
selectDay(passportExpiry);
selectDay(driverLicence);

但它不起作用,因为我需要完整地编写整个xpath,就像下面的代码一样,它可以工作 - 这很奇怪

1. driverLicence.findElement(By.xpath("**//div[@id='driver-licence']**//div[@id='day-region']//div/span/a[text()='01']")).click();

2. passportExpiry.findElement(By.xpath("**//div[@id='passport-licence']**//div[@id='day-region']//div/span/a[text()='01']")).click();

3. dateOfBirth.findElement(By.xpath("**//div[@id='date-of-birth']**//div[@id='day-region']//div/span/a[text()='01']")).click();

再次编写id属性是没有意义的,该属性在每个步骤中以粗体显示,并使该步骤不可重复使用和垃圾。

让我知道,在使用JAVASCRIPT进行网络应用时,是否有任何方法可以解决这个问题或任何其他人遇到类似问题

这是我在stackoverflow中的第一个问题,当我看到这种解决方案工作而不是

时,我想到了更广泛的基础
**webElement.FindElement(ChildElement).click**

1 个答案:

答案 0 :(得分:1)

当您使用webelement作为搜索上下文代替webdriver时,如果您使用的是xpath,则需要在xpath前加上'。'

dateOfBirth.findElement(By.xpath(".//div[@id='day-region']//div/span/a[text()='01']")).click();

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html#findElements-org.openqa.selenium.By-