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

Selenium测试运行太快,未等待选择单选按钮

亢保赫
2023-03-14

我有一个Selenium Grid和WebDriver 2.48.2测试运行得太快。大多数时候测试会停止,因为在按下按钮之前没有选择单选按钮。

单选按钮是使用基于JSON文件的JavaScript设置的,以在一个部分中动态创建任意数量的单选按钮。一旦单击继续按钮,该部分将被销毁,并使用新的单选按钮创建新的部分。

我尝试了一种含蓄的等待,但没有成功。

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

对我来说唯一有效的解决方案是延迟,以便有足够的时间点击单选按钮。

driver.findElement(By.id("radiobuttonid")).click();
Thread.sleep(delay);

但在我看来,这不是一个理想的解决方案,可能延迟时间不够长,或者太长,浪费时间;可以有任意数量的单选按钮,因此时间将呈指数增长。

我尝试用不同的预期条件设置各种显式等待,但没有成功。

我尝试等待创建单选按钮,因为它可能不存在(presenceOfElementLocated

我很难准确地找到预期条件应该做什么,因为描述很简短,容易被误解。

理想情况下,我希望在单击单选按钮后不久继续测试。如果可能,最好的方法是什么?

编辑

五十、 Bar下面的建议对我不起作用,但确定单选按钮是否存在非常有帮助,只是在单选按钮有机会被选中之前单击了“继续”按钮。

编辑2

这只是为了进一步说明耶利米的正确答案。我将代码放入一个方法中以使其可重用。

private static Predicate<WebDriver> forceSelectionOfElement (final String id)
{
    return new Predicate<WebDriver>()
    {
        @Override
        public boolean apply(WebDriver arg0)
        {
            WebElement element = arg0.findElement(By.id(id));                
            boolean rval = element.isSelected();

            if (!rval) {
                element.click();
            }

            return rval;
        }
    };
}

用法

WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(forceSelectionOfElement("q___01_02_01___1___a"));

记住要导入这个名称空间,我花了很长时间才发现我导入了错误的名称空间:)

import com.google.common.base.Predicate;

共有3个答案

杨柏
2023-03-14
匿名用户

您说过您探索了ExpectedConditions,您是否尝试过ExpectedConditions。elementToBeSelected()?您应该能够检测是否选中了单选按钮,然后再向前移动。试试这样的

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement radio = driver.findElement(By.id("radiobuttonid"));
radio.click();
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("ID of message element")));
// do stuff

编辑

在OP提供更多信息后更改了代码

闻人宇定
2023-03-14

我的方法是:

public bool IsElementPresent(By by, IWebDriver driver)
{
    try
    {
        driver.FindElement(by);
        return true;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
}

public bool IsElementPresent(By by, IWebDriver driver, int sec)
{
    bool itemExist = false;

    itemExist = IsElementPresent(by, driver);
    while (!itemExist && sec >= 0)
    {
        Thread.Sleep(1000);
        itemExist = IsElementPresent(by, driver);
        sec--;
    }

    if (sec == -1)
        return false;
    else
        return true;
}

打电话来测试是否存在

//Checking if element exist 10 sec
if(IsElementPresented(By.Id("radiobuttonid"),driver,10))
{
//element exist click on it
}
else
{
//didn't exist.
}
胡和煦
2023-03-14

我也遇到过类似的问题,但在我的例子中,我的“点击”事件丢失了。我的测试将继续,点击代码将触发,但元素的状态永远不会明显改变,测试将失败。我最终利用了WebDriverWait的循环行为,添加了一个关于所选状态更持久的自定义谓词。

WebDriverWait wait = new WebDriverWait(driver, 5);
        final By lookup = By.id("radio");
        LOG.debug("Wait for radio to be clickable.");
        wait.until(ExpectedConditions.elementToBeClickable(lookup)); //I assume this implies visibility.
        LOG.debug("Element clickable.  Proceeding into click behavior.");
        wait.until(new Predicate<WebDriver>() {
            @Override
            public boolean apply(WebDriver arg0) {
                LOG.debug("Resolving 'myId' Element");
                WebElement radio = arg0.findElement(lookup);                
                boolean rval = radio.isSelected();
                LOG.debug("Element Resolved and has a state of " + (rval ? "selected" : "not selected"));
                if (!rval) {
                    LOG.debug("Clicking on the Element!");
                    radio.click();
                }
                //If we return false we will loop.  So the first time through we let this click the radio for us.
                //Second time through we should find that the element is clicked.  If it's not we click it again until it represents the state we're wanting.
                return rval;;
            }});

自定义谓词将

  1. 解析WebElement

所以这应该不允许测试继续进行,直到元素的点击状态是我想要的。到目前为止,它基本上完成了我想要的。

同样值得注意的是,这条线。睡眠被认为不是硒相互作用的最佳实践。这就是ExplicitWait概念的用意。我已经链接了一个我知道正在讨论的最新主题。

线睡眠有效,但隐式等待、webdriverwait和fluent等待无效?

祝你好运!

 类似资料:
  • 我是Selenium IDE的新手,在这里需要选择单选按钮的帮助。就我而言,我正在尝试为由单选按钮组成的特定表单生成一个测试用例。当我运行命令以单独选择其中一个单选按钮时,该函数可以工作,但如果我运行整个测试用例,则单选按钮不会被选中并给出找不到Element Id的错误。这是我的html: 我的IDE命令:单击Target: id=ProjectSolutionsProject0。我尝试了ver

  • 我有一个带有输入框和用户界面选择下拉列表的表单,在ng-blur事件中,我调用了一个方法来自动选择所有三个用户界面选择中的选项。当我使用量角器e2e测试执行此操作时,它不会等待用户界面选择发生并提交表单,这会引发异常,因为它没有找到只有在提交包含所有必需字段的表单后才会出现的元素。我试过这样browser.wait 它正在抛出异常。

  • 我已经搜索了前面的一些问题,并没有能够纠正--我是一个完全的新手,所以请原谅我的无知...尝试使用以下方法选择页面上的第三个“单选”按钮: 结果是: “消息:没有此类元素:找不到元素:{”method“:”XPath“,”Selector“:”//[@id=“Wizard_Tabs”]/div/div[1]/div/ul/li[3]/input“}”

  • 我想知道如何随机选择1,以及如何使用selenium IDE在我的网站上的单选按钮/检查字段中随机选择1-6个选项之间的某个地方。 我已经有了一个脚本,可以在下拉菜单中进行随机选择,这工作很好-可以轻松修改以进行其他选择吗?(请包括代码示例,因为我是新手。) 感谢您的帮助。

  • 我正在尝试使用selenium和Python单击这个单选按钮。 我有 但它不允许我点击它。我如何使用名称、值或类、值等的组合来点击? 关于如何使用硒,是否有一个很好的信息来源?因为我所发现的大部分是在java上使用的,而我使用的是Python。 编辑:使用XPATH

  • 问题内容: 我是第一次使用Selenium,对这些选项不知所措。我在Firefox中使用IDE。 当我的页面加载时,它随后通过JSONP请求获取值,并以此填充select中的选项。 我如何让Selenium等待选择中的某个选项出现后再继续? 问题答案: 我认为你应该使用 命令。如果可能,让我看看您的Selenium IDE代码。