元素还没有准备好被选中,但wait.until()仍然继续吗?

时间:2014-10-21 15:53:19

标签: java selenium selenium-webdriver webautomation

我是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,所以它需要花一点时间才能开始,但这就是我想要添加等待逻辑的原因!

感谢您的任何建议。

1 个答案:

答案 0 :(得分: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"));