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

Eclipse Selenium是线程的替代品。睡眠()

秦经义
2023-03-14

我是测试自动化的新手,尤其是Selenium。我正在使用Selenium网络驱动程序Eclipse。我遇到的最大问题之一是我们的脚本由于互联网速度或服务器性能而崩溃。我目前使用Thread.sleep()来解决这个问题。然而,这并不是秘密,Thread.sleep()强制等待时间直到计时器完成。我试图为下面的脚本找到一个优化的解决方案。在浏览了Stackoverflow上的帖子后,我找到了下面的for()循环中提供的解决方案。有人建议使用:

jse.executeScript("arguments[0].click();", button_Sign).toString().equalsIgnoreCase("complete");

以确保操作(单击按钮)完成,如果没有完成,请稍稍等待,并在下一次迭代中再次尝试。
在我下面的例子中,每个循环将有6次尝试。但是代码会出现一个错误:

“失败:无法调用”对象。因为返回值为“org”。openqa。硒。JavascriptExecutor。executeScript(字符串,对象[])为空

代码是:

  public void SignSupportFormOnOrder() throws InterruptedException {
        JavascriptExecutor jse = (JavascriptExecutor)GlobalVariables._browser.currentDriver;
        ExplicitWait.until(ExpectedConditions.visibilityOf(Order_SignSupportingForms));
        actions.moveToElement(Order_SignSupportingForms).click().perform();
        
        //Code working but using Thread.sleep():
        //Thread.sleep(10000); //Need to look for an alternative solution
        //jse.executeScript("arguments[0].click();", button_Sign);
        /////////////////////////////////////////////////////////////////////////////////////////
        
        //try as alternative to Thread.sleep(...):
        
        for(int i=0; i < 5; i++){   
            if(jse.executeScript("arguments[0].click();", button_Sign).toString().equalsIgnoreCase("complete"))
                break;
            else
                Thread.sleep(1000);
            }

        //Thread.sleep(10000);
    }

有人能给我一个建议,我做错了什么,以及如何克服使用Thread.sleep();

共有1个答案

沈乐邦
2023-03-14

由于单击button_Sign会关闭一些弹出窗口,因此我们可以执行如下代码。

public boolean clickVisibleDisappearsLoop(String xpath1, String xpath2){
    waitForElementToBeVisible(xpath1);
    int counter = 0;
    while (counter<10) {
        try {
            clickOnElement(xpath1);
            waitForElementToDisappear(xpath2,4);
            return true;
        } catch (Throwable throwable) {
            wait(400);
            counter++;
        }
    }
    return false;
}

我在这里使用的方法有:


public void wait(int delay) {
    Uninterruptibles.sleepUninterruptibly(delay, TimeUnit.MILLISECONDS);
}

public boolean waitForElementToDisappear(String xpath){
    try {
        wait.until((ExpectedConditions.invisibilityOf(By.xpath(xpath))));
        return true;
    }catch (Throwable t){
        return false;
    }
}

在这里,您可以将button_Sign元素的XPath定位器传递为xath1,并通过单击button_Sign将弹出窗口的XPath定位器关闭为xpath 2
此外,根据Java约定,您应该将button_Sign命名为ButonSign。我建议将其命名为signBtnsignButton
此外,您不必在这里返回布尔值,因此可以简化这些方法,使其无效

 类似资料:
  • 首先,我没有问与C#相同的问题-线程的替代品。睡眠?,或线程的替代品。睡在C#?。我不认为我使用它是错误的,需要一个真正的替代特定的情况。 在一次代码分析运行中,我看到了一个令人惊讶的违规行为: 线程的用法。睡眠()是设计缺陷的标志。 这一违规行为导致彼得·里奇(Peter Richie)撰写了一篇文章,阐述了为什么这构成了糟糕的设计。 我们都知道线程创建是昂贵的,线程阻塞意味着池中的争用。我们还

  • 我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。 我找到了两种方法来完成这件事。 > 在没有睡眠的情况下旋转。 在睡眠中旋转循环。 如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?

  • 因此,我理解流畅而明确的等待,但过去我永远无法让隐含的语句起作用。我设法不使用显式词来处理它们,但我随后设计了一个相当简单的测试,但它只适用于线程。睡觉,我绝对讨厌这种方法,并试图不惜一切代价避免它。所以我再次尝试隐式等待函数。。。失败 下面的代码带有线程。睡眠按计划进行,非常好 但当我最终尝试使用隐式(如下面)时,它就不起作用了。我确保在声明驱动程序之后立即声明一次(在本例中为)。考试会在课前的

  • 问题内容: py2exe是否有替代品? 问题答案: cx_Freeze是跨平台的,并且具有相同的功能,或者您可以使用py2app,它仅在Mac上有效。

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 问题内容: 在教程中,我学会了使用。现在,我了解到,很多人对此表示反对。我已经尝试过,但随后它实际上将其发送到打印机。 那么我应该使用哪些替代方法,为什么不使用呢?w3schools和MDN都使用。 问题答案: 作为推荐的替代方法,您可以使用DOM操作直接查询节点元素并将其添加到DOM。