如果从DOM

时间:2017-09-11 09:21:44

标签: java selenium selenium-webdriver webdriver webdriverwait

我自动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元素。一旦删除,我可以继续进一步的行动吗?。

2 个答案:

答案 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")));
}