所以,我一直在为这个挑战而战战兢兢,到目前为止我还没有获胜。如果有人可以帮助我,我将不胜感激。详情如下。
下面是代码示例: 1 ,
1.在示例1中,不正确的xpath是这个“//input[@id='identifierIdd']”
2.这是故意的,只是为了检查流畅的等待。正如预期的那样,1 分钟后测试退出并出现异常org.openqa.selenium.NoSuchElementException:
import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
public class Tester01 {
public static void main(String[] args) {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://accounts.google.com/
signin/v2/identifier?
continue=https%3A%2F%2Fmail.google.com%2Fmail%2F
&service=mail&sacu=1&rip=1&flowName=GlifWebSignIn
&flowEntry=ServiceLogin");
webDriver.manage().window().maximize();
WebElement webElement;
Wait<WebDriver> fluentWaiter = new FluentWait<WebDriver>
(webDriver).withTimeout(1, MINUTES)
.pollingEvery(5, SECONDS)
.withMessage("element couldn't be found after 1 minutes")
.ignoring(NoSuchElementException.class);
webElement = fluentWaiter.until(new Function<WebDriver,
WebElement>()
{
public WebElement apply(WebDriver driver) {
return driver.findElement(By.xpath
("//input[@id='identifierIdd']"));
}
});
webElement.sendKeys("testemail.com");
}
}
- 因此,我决定尝试使用 fluentwait 和 pageFactory 不幸的是我无法弄清楚如何
Tester01
使用 pageFactory 从类中实现以下行。
return driver.findElement(By.xpath("//input[@id='identifierIdd']"));
fluentwait 和 pageFactory 实验的详细信息。下面是代码示例: 2 ,
import org.openqa.selenium.By; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.How; public class LocatorTest{ @FindBy(how = How.XPATH, using="//input[@id='identifierIdd']") public WebElement elementTest; }
和Tester01
班级一起LocatorTest
上课
public class Tester01 {
public static void main(String[] args) {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://accounts.google.com/signin/v2/identifier?
continue=https%3A%2F%2Fmail.google.
com%2Fmail%2F&service=mail&sacu=1&rip=1
&flowName=GlifWebSignIn&flowEntry=ServiceLogin");
webDriver.manage().window().maximize();
WebElement webElement;
Wait<WebDriver> fluentWaiter = new FluentWait<WebDriver>(webDriver)
.withTimeout(1, MINUTES)
.pollingEvery(5, SECONDS)
.withMessage("element couldn't be found after 1 minutes")
.ignoring(NoSuchElementException.class);
LocatorTest locatorTest = new LocatorTest();
PageFactory.initElements(webDriver, locatorTest);
webElement = fluentWaiter.until
(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver) {
return locatorTest.elementTest;
}
});
webElement.sendKeys("testemail.com");
}
}
因此Tester01
,使用 pagefactory 的类不会流畅地等待 1 分钟,测试会立即失败org.openqa.selenium.NoSuchElementException:
我想我知道问题是什么但是并不真正知道如何克服这个问题,
这是我对这个问题的解释,在Example: 2 Tester01
class fluentWaiter 实例中的 return 语句没有使用适当的驱动程序实例。
这是我正在谈论的行,return locatorTest.elementTest;
因为我认为方法 apply() 接受一个Webdriver
实例,但是该行return locatorTest.elementTest;
不使用该driver
实例。
我的想法正确吗?有人可以帮我解决这个问题吗?或者请提出替代解决方案?
如果以上任何内容没有意义或需要更多信息,请告诉我。
在此先感谢尼罗