Selenium fluent 等待和页面工厂
Selenium fluent wait and page factories
所以,我一直在为这个挑战而烦恼,到目前为止我还没有赢。
如果有人可以帮助我,我将不胜感激。
详情如下。
下面是代码例子:1,
1.In例1,错误的xpath是这样的"//input[@id='identifierIdd']"
2.This是故意的,只是为了检查流畅等待。正如预期的那样,在 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,不幸的是我无法弄清楚如何使用 pageFactory 从
Tester01
class 实现以下行。
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
class和LocatorTest
class
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
class 使用 pagefactory 不会流畅地等待 1 分钟,测试立即失败 org.openqa.selenium.NoSuchElementException:
我想我知道问题是什么,但我真的不知道如何解决这个问题,
这是我对问题的解释,在示例中:2 Tester01
class fluentWaiter 实例中的return 语句没有使用适当的驱动程序实例。
This is the line I'm talking about return locatorTest.elementTest;
因为我认为方法 apply() 接受一个 Webdriver
实例
return locatorTest.elementTest;
行没有使用 driver
实例。
我的想法对吗?
有人可以帮我解决这个问题吗?
或者请提出替代解决方案?
如果以上任何内容没有意义或需要更多信息,请告诉我。
提前致谢
尼罗
PageFactory.initElements()
将为所有 WebElement
和 List<WebElement>
字段创建 Proxy
。并且还设置了在 FindBy
注释中传递的定位器策略。不执行元素定位。这是一个惰性初始化。实际位置将在 click(), sendkeys()
等命令发送到 webelement
.
时完成
现在在第一种情况下,您搜索实际元素
webElement = fluentWaiter.until(new Function<WebDriver,
WebElement>()
{
public WebElement apply(WebDriver driver) {
return driver.findElement(By.xpath
("//input[@id='identifierIdd']"));
}
});
在第二种情况下,您只是对页面对象进行 java 调用,该页面对象 return 支持代理对象。不涉及硒业务。
webElement = fluentWaiter.until
(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver) {
return locatorTest.elementTest;
}
});
但是当此代码为 运行 - webElement.sendKeys("testemail.com");
时,实际的元素定位已完成,但失败了。这里没有等待。 PageFactory
是用 webDriver
实例初始化的。
从 ExpectedConditions
查看 [ExpectedConditions] class which you can use along with the FluentWait or the specialized [WebDriverWait]. Use a method like visibilityOf(WebElement) 其中 return ExpectedCondition<WebElement>
。
或者您甚至可以查看 LocatorFactory
,它在搜索元素时会等待一段时间。 AjaxElementLocatorFactory and AjaxElementLocator。虽然这将是一种矫枉过正,因为这些是针对 Ajax 个案例而不是错误的定位器。
所以,我一直在为这个挑战而烦恼,到目前为止我还没有赢。 如果有人可以帮助我,我将不胜感激。 详情如下。
下面是代码例子:1,
1.In例1,错误的xpath是这样的"//input[@id='identifierIdd']"
2.This是故意的,只是为了检查流畅等待。正如预期的那样,在 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,不幸的是我无法弄清楚如何使用 pageFactory 从
Tester01
class 实现以下行。
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
class和LocatorTest
class
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
class 使用 pagefactory 不会流畅地等待 1 分钟,测试立即失败 org.openqa.selenium.NoSuchElementException:
我想我知道问题是什么,但我真的不知道如何解决这个问题,
这是我对问题的解释,在示例中:2 Tester01
class fluentWaiter 实例中的return 语句没有使用适当的驱动程序实例。
This is the line I'm talking about return locatorTest.elementTest;
因为我认为方法 apply() 接受一个 Webdriver
实例
return locatorTest.elementTest;
行没有使用 driver
实例。
我的想法对吗? 有人可以帮我解决这个问题吗? 或者请提出替代解决方案?
如果以上任何内容没有意义或需要更多信息,请告诉我。
提前致谢 尼罗
PageFactory.initElements()
将为所有 WebElement
和 List<WebElement>
字段创建 Proxy
。并且还设置了在 FindBy
注释中传递的定位器策略。不执行元素定位。这是一个惰性初始化。实际位置将在 click(), sendkeys()
等命令发送到 webelement
.
现在在第一种情况下,您搜索实际元素
webElement = fluentWaiter.until(new Function<WebDriver,
WebElement>()
{
public WebElement apply(WebDriver driver) {
return driver.findElement(By.xpath
("//input[@id='identifierIdd']"));
}
});
在第二种情况下,您只是对页面对象进行 java 调用,该页面对象 return 支持代理对象。不涉及硒业务。
webElement = fluentWaiter.until
(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver) {
return locatorTest.elementTest;
}
});
但是当此代码为 运行 - webElement.sendKeys("testemail.com");
时,实际的元素定位已完成,但失败了。这里没有等待。 PageFactory
是用 webDriver
实例初始化的。
从 ExpectedConditions
查看 [ExpectedConditions] class which you can use along with the FluentWait or the specialized [WebDriverWait]. Use a method like visibilityOf(WebElement) 其中 return ExpectedCondition<WebElement>
。
或者您甚至可以查看 LocatorFactory
,它在搜索元素时会等待一段时间。 AjaxElementLocatorFactory and AjaxElementLocator。虽然这将是一种矫枉过正,因为这些是针对 Ajax 个案例而不是错误的定位器。