Selenium webdriver 硒:为什么点击前需要睡眠?

Selenium webdriver 硒:为什么点击前需要睡眠?,selenium-webdriver,Selenium Webdriver,Selenium 2.25、Firefox、OSX ML 我必须单击一个具有Ajax影响的按钮 然后我想与结果进行交互。如果没有下面的睡眠,我会得到一个错误,单击失败,因为它无法将单击目标滚动到视图中。我不明白。发生什么事了 WebElement sampleComboInput = driver.findElement(By.id("sampleCombo-inputEl")); sampleComboInput.click(); sampleComboInput.se

Selenium 2.25、Firefox、OSX ML

我必须单击一个具有Ajax影响的按钮

然后我想与结果进行交互。如果没有下面的睡眠,我会得到一个错误,单击失败,因为它无法将单击目标滚动到视图中。我不明白。发生什么事了

    WebElement sampleComboInput = driver.findElement(By.id("sampleCombo-inputEl"));
    sampleComboInput.click();
    sampleComboInput.sendKeys("English-03.txt");
    sampleComboInput.sendKeys(Keys.TAB, Keys.TAB);
    WebElement goButton = driver.findElement(By.id("inputDialogGoButton-btnInnerEl"));
    goButton.click();

    WebElement resultsSpan = driver.findElement(By.cssSelector("span.ne-type-node.PERSON"));
    assertTrue(resultsSpan.isDisplayed());
    assertEquals("PERSON (3)", resultsSpan.getText());
    WebElement parent = resultsSpan.findElement(By.xpath(".."));
    Thread.sleep(5000); // without sleep, get error unable to scroll
    Actions action = new Actions(driver);
    action.doubleClick(parent);
    action.perform();

它需要等待元素加载,您是否尝试改为waitForVisible?使用睡眠可能会使代码在等待时间更长的其他机器上无法运行,这可能会更有效。您应该尽量避免使用线程。睡眠,因为它会导致工作不一致。太空游侠是正确的,它需要等待元素加载

c#版本有“WebDriverWait”类和“Until”方法。使用这两种方法,您可以等待加载元素

请看Loudenvier对此帖子的回答:


这是我喜欢的方式。易于使用,易于重用,并避免了与Thread.Sleep相关的问题。

该元素很久以前就已加载,否则我将无法找到它。还要注意“isDisplayed”。是否不可见但显示?从wiki“确定指定元素是否可见。通过将CSS“可见性”属性设置为“隐藏”或“显示”属性设置为“无”,可以使元素不可见,对于元素本身或其祖先。如果元素不存在,此方法将失败。“waitForVIsible不是2.25.0中Java API的一部分。它被删除,以支持隐式等待,而隐式等待处于启用状态。