当前位置: 首页 > 知识库问答 >
问题:

显式等待硒网络驱动程序

凤财
2023-03-14

正在研究尝试理解显式等待的方法。

    require 'rubygems'
require 'selenium-webdriver'
require 'cucumber'

$driver = Selenium::WebDriver.for :firefox
$driver.manage.timeouts.implicit_wait = 3

    Then /^do search$/ do
  driver = $driver
  one_way = driver.find_element(:id, "search.ar.type.code.oneWay").click
    sleep 5
   from = driver.find_element :xpath => "//div[@class = 'origin column1']//input[@type = 'text']"
   from.click

所以one_way单选按钮被点击后,输入形式发生了变化,所以我把sleep 5给它一个时间元素出现,否则会出错“元素不可见......”。所以我认为现在是理解显式等待的好时机,因为我需要等到元素出现。

    wait = Selenium::WebDriver::Wait.new(:timeout => 40)
  wait.until {from = driver.find_element(:xpath, "//div[@class = 'origin column1']//input[@type = 'text']")
  from.click
  }

但出现错误“Selenium::WebDriver::error::ElementNotVisibleError:Element当前不可见,因此可能无法与之交互”。为什么这段代码不等到元素出现并单击它?

共有1个答案

戚建白
2023-03-14

问题是该元素还不在DOM中,因此需要在其中添加一个时间延迟。

也就是说,ruby的API文档说应该这样做

require 'rubygems' # not required for ruby 1.9 or if you installed without gem
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://somedomain/url_that_delays_loading"

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
  element = wait.until { driver.find_element(:id => "some-dynamic-element") }
ensure
  driver.quit
end

请注意,然后可以< code >的元素。click()是从wait.until方法而不是代码中的find_element()方法分配的。

但是,任意延迟并不总是有效,如果站点繁忙,则延迟可能不够长。更好的选择是等待元素变为可单击或可见。

JavaAPI的有期望条件的便利方法,cn可以这样使用…

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
element.click();

不幸的是,我认为Ruby还没有这个。您可能需要编写自己的expectedContions类或包。

我不是一个Ruby开发人员,但这里有一个Java函数的想法,可以用来实现你的期望条件

public WebElement findElementInTime(WebDriver driver, By by, int timeoutInSeconds)
    {
        log.debug("==================+>>>>>> looking for element for "+ timeoutInSeconds + " seconds");
        WebElement ret = null;

        for (int second = 0; second < timeoutInSeconds; second++) {
            try { if (isElementPresent(driver,by)) {
                log.debug("found element :-)");
                ret = driver.findElement(by);
                break;
            }} catch (Exception e) {

                log.debug("oops... sleeping 1 sec wait for button");
            }
            log.debug("sleeping 1 sec wait for button");
        }
        return ret;
    }
 类似资料:
  • 下面是我为firefox浏览器初始化的selenium web驱动程序。 尽管我给出了隐式等待,但我没有等待元素。它会立即抛出not found异常。如果我放那么它工作正常,没有任何问题。但是把现在测试用例包含更多线程的任何地方。sleep比实际的测试用例代码低。有人能给我建议正确的方法吗?

  • 我在eclipse中使用SeleniumWebDriver和TestNG。问题是页面在某些数据的中途重新登录,并且重新加载的时间是灵活的,这就是为什么我不能应用显式等待时间。我想让webdriver等待,直到重新加载完成。 我正在尝试通过此代码执行此操作……但它不起作用。

  • im在Jmeter(web驱动程序)上编写Java代码以执行负载测试,我需要实现隐式等待,类似于: WDS.manage().timeouts().隐式等待(60, TimeUnit.SECONDS); 但似乎Jmeter并不理解它,我还试图用: def wait=new org.openqa.selenium.support.ui.WebDriverWait(WDS.browser,5);等待,

  • 如何等待硒Web驱动程序中的子窗口 当我点击提交按钮,它会把我带到子窗口,我断言URL,但有时子窗口需要时间来目前使用thread.sleep(4000),但这是错误的方式。

  • 我试图使用SeleniumWebDriverWait类型,在检查元素是否存在之前,等待页面完全加载。我尝试了两种不同的方法。 第一个方法使用IgnoreExceptionTypes,然后在Until方法内调用FindElement。这会立即抛出NoTouchElementException,而无需等待。我希望这会继续尝试查找元素,直到超时,同时忽略NosTouchElementException。

  • 问题内容: 我们正在将Selenium与Java API和一些Javascript用户扩展一起使用。我们在应用程序中使用了很多AJAX调用。我们的许多测试都是随机失败的,因为有时AJAX调用的完成速度比其他时间慢,因此页面未完全加载。我们通过等待特定元素或Thread.sleep来解决此问题。我试图找到一种方法来代替等待网络流量完成。这样我们就可以做到这一点: 这样,我们可以摆脱线程休眠,并在服务