gpt4 book ai didi

java - 需要编写没有Thread.sleep的selenium代码

转载 作者:行者123 更新时间:2023-12-01 09:19:35 25 4
gpt4 key购买 nike

我编写了以下代码来登录网站 "qtpselenium.com" .

如果我在中间给出 Thread.sleep 以使代码执行暂停一段时间,下面的代码就可以正常工作。如果我评论 Thread.sleep,代码将无法按预期工作。我尝试使用隐式和显式的 Selenium 等待来使驱动程序等待元素可见,但代码仅在我使用 Thread.sleep 时按预期工作。

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

在 selenium 代码中使用 Thread.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();
}
}

最佳答案

是的,使用Thread.sleep()通常是不好的做法。 sleep 不是动态的。他们只等待指定的时间……不多也不少。这通常不好,因为如果您正在等待的元素在 25 毫秒内返回,那么您将等待整整 10 秒。如果元素出现在 10.5 秒,那么它就会失败。通过自动化,我们希望尽可能快地进行,同时保持一致的结果。使用 WebDriverWait 将允许脚本暂停并等待指定的条件。一旦满足条件,脚本就会继续。如果不满足,脚本将暂停指定的时间并重试,直到满足条件或发生超时(引发异常)。因此,请确保在合理的时间内等待。

而是使用WebDriverWait,如下所示。查看ExpectedConditions。您可以等待许多条件...元素存在、元素可点击等。

我切换到 geckodriver 并再次尝试了该代码。我更改了您的定位器以使它们更加具体。他们基本上是在寻找包含特定文本的标签。您可以多次重复使用该定位器。下面的代码对我有用。我删除了 sleep 并将其替换为 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();

关于java - 需要编写没有Thread.sleep的selenium代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40254276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com