0

所以,我一直在为这个挑战而战战兢兢,到目前为止我还没有获胜。如果有人可以帮助我,我将不胜感激。详情如下。

下面是代码示例: 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");
    }
    }
  1. 因此,我决定尝试使用 fluentwait 和 pageFactory 不幸的是我无法弄清楚如何Tester01使用 pageFactory 从类中实现以下行。

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

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实例。

我的想法正确吗?有人可以帮我解决这个问题吗?或者请提出替代解决方案?

如果以上任何内容没有意义或需要更多信息,请告诉我。

在此先感谢尼罗

4

1 回答 1

0

PageFactory.initElements()将为Proxy所有WebElementList<WebElement>字段创建。并设置在FindBy注释中传递的定位器策略。不执行元素的定位。这是一个惰性初始化。当诸如click(), sendkeys()etc 之类的命令发送到webelement.

现在在第一种情况下,您搜索实际元素

webElement = fluentWaiter.until(new Function<WebDriver, 
    WebElement>()
    {
       public WebElement apply(WebDriver driver) {
          return driver.findElement(By.xpath
            ("//input[@id='identifierIdd']"));
        }
    });

在第二种情况下,您只是对页面对象进行 java 调用,该页面对象将返回 Proxy 对象。不涉及硒业务。

webElement = fluentWaiter.until
    (new Function<WebDriver, WebElement>()
    {
        public WebElement apply(WebDriver driver) {
            return locatorTest.elementTest;
        }
    });

但是,当此代码运行时 - webElement.sendKeys("testemail.com");,实际元素位置已完成并且它失败了。这里不涉及等待。是用实例PageFactory初始化的。webDriver

查看可以与 FluentWait 或专用[WebDriverWait]一起使用的[ExpectedConditions]类。使用像visibilityOf(WebElement)这样的方法,从中返回.ExpectedConditionsExpectedCondition<WebElement>

或者您甚至可以查看在LocatorFactory搜索元素时等待特定时间段的 a。AjaxElementLocatorFactoryAjaxElementLocator。虽然这将是一个矫枉过正,因为这些是针对 Ajax 案例而不是错误的定位器。

于 2018-04-14T20:53:46.037 回答