我自动this网站但面对问题需要ExplicitWait
条件来管理时间。
场景是当我在发送用户名后单击“登录”链接或“提交”按钮时,它会在进程中显示一个加载程序,一旦进程完成,就会从DOM中删除加载程序。
我已使用invisibilityOfElementLocated
的条件,如下所示
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar")));
但是这不能预测花费更多时间的正确时间(不是60秒但是大约15-20或者可能是30秒)然后允许执行下一个命令。
我必须在4个命令之前放入相同的行来完成登录过程。所以它似乎消耗了大约90秒来登录。
如果我不使用Explicitwait
或删除Impliciwait
等待,那么脚本会一直失败,因为加载器会点击而不是其他元素。
我到目前为止尝试的代码:
WebDriver driver = new FirefoxDriver();
System.out.println("Browser Opened");
driver.manage().window().maximize();
driver.get("https://www.rcontacts.in");
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.println("URL Opened");
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar")));
driver.findElement(By.cssSelector(".ng-scope>a span[translate='login.register']")).click();
System.out.println("Register Link Clicked");
driver.findElement(By.name("userId")).sendKeys("9422307801");
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar")));
driver.findElement(By.xpath("//button[@type='submit']")).click();
System.out.println("Mobile number entered");
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar")));
有没有解决方案,只要加载程序被删除就会开始执行操作?
OR是否有任何方法可以等到从DOM中删除loader元素。一旦删除,我可以继续进一步的行动吗?。
答案 0 :(得分:1)
首先,你已经诱导implicitlyWait()
如下:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
以及WebDriverWait()
如下:
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar")));
根据Explicit and Implicit Waits的文件,明确提到:
不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置10秒的隐式等待和15秒的显式等待可能会导致20秒后发生超时。
同样,似乎将ExpectedConditions
条款从invisibilityOfElementLocated(By.id("loading-bar")
更改为elementToBeClickable(By.xpath("//span[contains(text(),'Register')]")
使我的成功率达到80%。这是我Windows 8
框上的有效代码块:
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("https://www.rcontacts.in");
System.out.println("URL Opened");
WebDriverWait wait = new WebDriverWait (driver, 15);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[contains(text(),'Register')]")));
driver.findElement(By.xpath("//span[contains(text(),'Register')]")).click();
System.out.println("Register Link clicked");
注意:始终在driver.quit()
方法中调用tearDown(){}
以关闭&优雅地销毁 WebDriver 和 Web客户端实例,以确保在您启动时不存在 geckodriver 的悬空实例(通过Task Manager
)执行。
答案 1 :(得分:1)
根据the docs,
警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。
这可能是导致问题的原因。建议不要使用隐式等待。我会删除它们,然后根据需要添加显式等待,看看它是怎么回事。
我拿了你的代码并重新编写(下面)并且它每次都为我工作。
String url = "https://www.rcontacts.in";
driver.navigate().to(url);
waitForLoader();
driver.findElement(By.cssSelector("span[translate='login.register']")).click();
waitForLoader();
driver.findElement(By.cssSelector("input[name='userId']")).sendKeys("9422307801");
driver.findElement(By.cssSelector("button[translate='common.btns.next']")).click();
我有时遇到的问题是剧本多次跳过。我将代码添加到waitForLoader()
以等待加载器出现(可见)然后消失(不可见)。一旦我这样做,它就有100%的时间工作。
public static void waitForLoader()
{
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.id("loading-bar")));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar")));
}