PhantomJS 将键发送到错误的输入

PhantomJS sending keys to wrong input

我有一个 Java 使用 selenium 和 phantomJS 的应用程序。

我构建了一个登录应用程序的测试。有一个步骤是我发送用户名和密码密钥,如下所示:

this.usernameField.sendKeys(username);
this.passwordField.sendKeys(password);

字段由 ID 标识。

测试在 Chrome 中工作正常,但在 PhantomJS 中,两个键都发送到用户名输入。

例如:用户名:John - 密码:banana

如果我在发送用户名之后但在发送密码之前放置一个断点并等待,然后释放它,它会导致:"Username: [John] Password: [banana]"

有时我会收到“[Johnban] [ana]”或“[Johnbana] [na]”等等。

这是已知错误吗?我使用 org.seleniumhq.selenium:selenium-java:3.4.0 的 PhantomJS 很好,但现在我不得不将版本更新到 org.seleniumhq.selenium:selenium-java:3.141.59 并包含 com.codeborne:phantomjsdriver:1.4.4.

如何在不将 "wait" 放在整个代码中的情况下解决此问题?

这不是错误。如果您的页面加载速度快于代码执行速度,您甚至可能在 Chrome 中遇到相同的情况。看来你的 PhantomJS 就是这种情况。

您可以做的是避免在代码中到处等待,将等待行为包装在某些 class 中,等到元素可见并在上层执行操作。

您可以使用presenceOfElementLocated检查并获取元素

public class ElementFinder {
       public WebElement find(By locator) {
          WebDriverWait wait = new WebDriverWait(driver, timeout);
          WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(locator));
          return element;
       }
    }

然后找到并调用您的 sendKeys。为了避免强制转换(你应该)WebElement,你可以使用泛型,只是想在例子中给出这个想法。

此外,您可以查看 Martin Fowler herePageObjects。它使我上面建议的那些类型的操作变得容易,将 InputElements 及其行为包装在某个对象中,也适用于页面的其余部分。

因此,在这种特殊情况下,先将顺序切换为 "password",然后再切换为 "username",问题就解决了。

澄清一下,有问题的页面是 Jira。

您是否尝试放入一个循环来检查您的脚本输入的值是否符合您的预期?有时这会奏效。