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");
    }
    }
  1. 所以,我决定尝试使用 fluentwait 和 pageFactory,不幸的是我无法弄清楚如何使用 pageFactory 从 Tester01 class 实现以下行。

return driver.findElement(By.xpath("//input[@id='identifierIdd']"));

  1. 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;
    
    }
    

Tester01class和LocatorTestclass

    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() 将为所有 WebElementList<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 个案例而不是错误的定位器。