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

需要在没有线程的情况下编写selenium代码。sleep

沈高峻
2023-03-14

我写了下面的代码来登录网站“qtpselenium.com”。

如果我将Thread.Sleep放在中间,使代码执行暂停一段时间,下面的代码就可以正常工作。如果我对thread.sleep进行注释,代码就不能按预期工作。我尝试使用selenium的隐式和显式等待来使驱动程序等待元素可见,但代码只能在使用Thread.Sleep时按预期工作。

有没有什么方法可以使下面的代码在不使用thraed.sleep语句的情况下工作。

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;

public class QTPSelenium {

    public static WebDriver driver = null;

    public static void main(String[] args) throws InterruptedException {

        System.setProperty("webdriver.gecko.driver","C:\\Eclipse\\Drivers\\geckodriver.exe");
        driver = new FirefoxDriver();
        driver.get("http://qtpselenium.com/");

        driver.findElement(By.xpath(".//*[@class='btn btn-default member_login']")).click();
        Thread.sleep(10000);            

        driver.findElement(By.xpath("(//button[@type='submit'])[3]")).click();
        Thread.sleep(10000);

        driver.findElement(By.id("email")).sendKeys("Some Email ID");
        driver.findElement(By.id("login-password")).sendKeys("Some Password");
        driver.findElement(By.xpath("html/body/main/div[2]/div/div/div[1]/div/div/div/form/button")).click();
    }
}

共有1个答案

皇甫树
2023-03-14

是的,使用thread.sleep()通常是很糟糕的做法。睡眠不是动态的。他们只等规定的时间……不多不少。这通常是不好的,因为如果您等待的元素在25毫秒后返回,那么您将等待整整10秒。如果元素在10.5s处出现,那么它将失败。对于自动化,我们希望尽可能快地进行,同时保持一致的结果。使用webdriverwait将允许脚本暂停并等待指定的条件。条件满足后,脚本继续。如果不满足,脚本将暂停指定的时间,然后重试,直到满足条件或发生超时(抛出异常)。所以,确保你等待的时间是合理的。

请使用webdriverwait,如下文所示。看看expectedconditions。有很多条件你可以等待...元素的存在、可点击的元素等。

我切换到geckodriver并再次尝试代码。我改变了你的定位器让它们更明确。他们基本上是在寻找一个包含特定文本的标记。您可以多次重复使用该定位器。下面的代码对我有效。我删除了sleeps,并用webdriverwait替换它们。

driver.get("http://qtpselenium.com/");
driver.findElement(By.xpath("//button[contains(.,'Member Login')]")).click();
WebDriverWait wait = new WebDriverWait(driver, 5); // create a WebDriverWait that we will reuse
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(.,'Login to Selenium Account')]"))).click();
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("email"))).sendKeys("Some Email ID");
driver.findElement(By.id("login-password")).sendKeys("Some Password");
driver.findElement(By.xpath("//button[contains(.,'Login')]")).click();
 类似资料:
  • 问题内容: 我知道Go将来不会有泛型,并且有一些建议可以用其他结构代替它们。但是在下面的例子中,我陷入了困境。 您可能会猜到,我试图使任何错误均告失败,并且希望将任何返回两个结果的函数放到第二个错误中。这工作正常,但丢失了它的类型信息,并且结果中只是一个空接口。 由于我也正在调用lib函数,因此我看不到使用Interfaces或Reflection解决此问题的方法。 有任何想法吗?我是完全走错了道

  • 问题内容: 我刚刚开始使用Python,我想知道如何在不需要框架的情况下对Web应用程序进行编程。我是一位经验丰富的PHP开发人员,但是我有尝试Python的冲动,而且我通常喜欢从头开始编写,而没有受到flask和django等框架的限制。 问题答案: WSGI是Web服务器接口的Python标准。如果要创建自己的框架或在没有框架的情况下运行,则应进行研究。特别是,我发现Ian Bicking的D

  • 另外,我希望在执行过程中隐藏'geckodriver.exe窗口‘。 ……余下的代码将继续....

  • 我们有一个应用程序,将部署在具有不同IP的服务器上。JNLP是在构建时生成的。因此,我们定义了没有代码库的JNLP: 然而,当第二次启动这个应用程序时(从第一次启动时创建的桌面图标),代码库被设置为本地文件系统,这是绝对无用的。我希望Java Webstart在第一次启动应用程序时使用实际的源地址设置代码库。这似乎不是真的。 我如何准备一个通用的JNLP,它可以在不同的服务器上使用而无需修改?

  • 我现有的Datastax Cassandra设置正在运行。我们刚刚在系统中添加了身份验证,现在我们可以使用我们的AD帐户登录。这非常好,当然有效。但是应用程序需要使用硬编码的用户名/密码才能连接。 在SQL Server中,我们能够设置一个用户作为运行服务,然后它将通过AD连接和工作。然而,在卡珊德拉这是不一样的。 如果我不想在app.config文件中包含用户名,尤其是密码,我有什么选择?

  • 远程类加载是指加载未在执行位置显示的类。 例如,JavaApplet需要将类从服务器加载到本地并在本地执行。 一些包含URLClassLoader的程序需要从网络加载类,并在本地执行。 RMI怎么样?我找到了一个名为RMIClassLoader的类?是远程类加载吗?