【问题标题】:Element is not ready to be selected, but wait.until() still continues regardless?元素尚未准备好被选中,但 wait.until() 仍然继续?
【发布时间】:2014-10-22 12:32:06
【问题描述】:

我是 Selenium 的新手,对 Java 也很陌生。我是一名测试人员,而不是开发人员,所以我正在尝试逐渐将我的 Selenium IDE 脚本转换为更强大和“适当”的东西。不幸的是,我正在努力完成一项相当基本的任务。网页加载后,我想单击一个按钮。这在 Selenium IDE 中运行良好,但前提是我将速度设置为“慢”。

我可以使用以下代码让它工作,但前提是我包含 thread.sleep 行。我读到这不是一个好主意,所以我正在尝试使用 webDriverWait 实现更智能的东西。

public class mytestclass {

    private WebDriver driver;
    private String baseUrl;

    @Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = "";
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    }


    @Test
    public void test1() throws Exception {
        driver.get(baseUrl + "file:///C:/_VM/testpage.html");
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("button_X")));
        //Thread.sleep(2000);
        driver.findElement(By.id("button_X")).click();    
     }

}

因此,在执行 thread.sleep 行时它正在工作的事实让我相信,当按钮实际上没有准备好时,wait.until 行返回 true。我还尝试将 ExpectedConditions 切换为其他标识符,例如 visibilityOfElementLocated(By locator) 和 presenceOfElementLocated(By locator),但它们的行为方式也相同。

我在这里做错了吗?还有什么我可以尝试的吗?

恐怕我无法链接到该网站,因为它与工作有关。它确实会读取大量图像并在启动时运行大量 javascript,因此确实需要一些时间才能开始,但这就是我要添加等待逻辑的原因!

感谢您的建议。

【问题讨论】:

  • 我从不混合隐式等待和显式等待,所以我不能 100% 确定混合它们是你的问题,但混合两种类型的等待绝对是你不想做的事情。请参阅 thisthis。 (注意:即使其他问题是用其他语言编写的,也没关系。Selenium 在不同语言中的工作原理大致相同。)

标签: java selenium selenium-webdriver webautomation


【解决方案1】:

您网站的启动是否涉及 jQuery?如果是这样,你可以试试这个。我发现它对我的测试很有帮助。它是用 C# 编写的,但我相信你可以将它转换为 java。

等到 jQuery 准备好:

IWait<IWebDriver> wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(WAITFORELEMENT_TIMEOUT));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));

【讨论】:

  • 感谢您的反馈。经过一番谷歌搜索后,我设法找到了一个与您的代码等效的基于 java 的代码,如下所示:private void waitForJQuery(WebDriver driver) { (new WebDriverWait(driver, 10)).until(new ExpectedCondition&lt;Boolean&gt;() { public Boolean apply(WebDriver d) { JavascriptExecutor js = (JavascriptExecutor) d; return (Boolean) js.executeScript("return jQuery.active == 0"); } }); } 我还不太清楚它是如何工作的(我的列表中的下一个!),但它确实有效.
  • 这对于通过 jQuery 更新并且最终不必使用 Sleep.Timeout 的表格单元格非常有效。谢谢!
猜你喜欢
  • 2016-01-24
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2018-06-05
  • 1970-01-01
  • 2019-10-02
相关资源
最近更新 更多