Selenium:执行同一行一段时间工作不起作用

时间:2015-08-17 21:49:06

标签: java selenium

下面是我的代码:当我运行此代码时,它执行10行,其他时间执行超过20行。 当问题发生时,它会停止并发现错误“没有这样的元素”。 我认为这是由于重新加载或页面等待时间。不确定请帮助我,如果你能:):

错误讯息:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element,
WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 20.06 seconds
    WebDriver HP=new ChromeDriver();
    HP.get("https://**********************/");
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.manage().window().maximize();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.findElement(By.linkText("Northland")).click();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.navigate().back();
    HP.findElement(By.linkText("Auckland")).click();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.navigate().back();
    HP.findElement(By.linkText("Waikato")).click();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.navigate().back();
    HP.findElement(By.linkText("Bay of Plenty")).click();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.navigate().back();
    HP.findElement(By.linkText("Gisborne")).click();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.navigate().back();
    HP.findElement(By.linkText("Hawkes Bay")).click();
    HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    HP.navigate().back();

5 个答案:

答案 0 :(得分:1)

正如 JeffC 在您的问题评论部分中正确陈述的那样:

  

.implicitWait()实际上并没有等待,它设置了默认的等待时间。你只需要这样做一次。有关详细信息,请查看Selenium文档:link

您需要明确等待链接可访问(如 Asit Tripathy 的答案演示),如下所示:

new WebDriverWait(this.driver, 20, 1)
        .until(ExpectedConditions.elementToBeClickable(linkSelector));

在您的特定背景下,意味着类似以下内容:

public static void main(String[] args) {
    WebDriver HP=new ChromeDriver();
    HP.get("https://**********************/");
    HP.manage().window().maximize();
    clickLinkAndGoBack(HP, "Northland");
    clickLinkAndGoBack(HP, "Auckland");
    clickLinkAndGoBack(HP, "Waikato");
    clickLinkAndGoBack(HP, "Bay of Plenty");
    clickLinkAndGoBack(HP, "Gisborne");
    clickLinkAndGoBack(HP, "Hawkes Bay");
}

private void clickLinkAndGoBack(WebDriver driver, String linkText) {
    ExpectedCondition<WebElement> condition;
    condition = ExpectedConditions.elementToBeClickable(By.linkText(linkText));
    WebElement link = new WebDriverWait(driver, 20, 1).until(condition);
    link.click();
    // actually do something after clicking (check displayed ...?)
    driver.navigate().back();
}

答案 1 :(得分:0)

在您的完整代码中,您将以数据驱动的方式运行

Loop Start 
{

HP.findElement(By.linkText("**Your LinkText**")).click();
HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
HP.navigate().back();

}

Loop END

您的LinkText ”是您要解析的数据。

所以在上面的代码中“没有这样的元素异常”只会出现在一个地方

1:findElement(By.linkText("**Your LinkText**")

现在,在您的代码中,您使用了implicitlyWait(20, TimeUnit.SECONDS);多个不需要的地方。

WebElement linkElement = (new WebDriverWait(driver, 30))
          .until(ExpectedConditions.presenceOfElementLocated(By.linkText("THE Linked Text You Entering")));
linkElement .click();

以上述方式,您将节省执行时间,并且不会出现此类元素异常。

根据您的需要,您可以增加WebDriverWait时间限制和ExpectedConditions方法,例如isDisplayed()isEnabled等....

答案 2 :(得分:0)

非常感谢你,我想出了解决方案。 代码:

 public class Homepage {
 public static void LoadDistrict(WebDriver HP, String district){
    HP.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    HP.findElement(By.linkText(district)).click();
    HP.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    HP.navigate().back();
  }

    public static void main(String[] args) {
    WebDriver HP=new ChromeDriver();
    HP.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    HP.get("https://********/");
    LoadDistrict(HP, "Northland");
    LoadDistrict(HP, "Auckland");
    LoadDistrict(HP, "Waikato");
    LoadDistrict(HP, "Bay of Plenty");
    LoadDistrict(HP, "Gisborne");
    LoadDistrict(HP, "Hawkes Bay");
    LoadDistrict(HP, "Taranaki");
    LoadDistrict(HP, "Wanganui");
    LoadDistrict(HP, "Manawatu");
    LoadDistrict(HP, "Wairarapa");
    LoadDistrict(HP, "Wellington");
    HP.close();
  }
 }

答案 3 :(得分:-1)

正如您所说,这可能是由于加载时间。只需添加另一个

HP.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
每次

HP.navigate().back();
它应该有效,即使它等了很长时间。也许用5秒就​​可以了。

编辑:如其他答案所述,给定的行实际上并没有等待。我想,所以这个答案不起作用。尝试查找文档并使用实际使其等待的命令替换行(如果可以的话,使用Thread.sleep(int))。

答案 4 :(得分:-1)

嗨,我不赞成我的解决方案是最好的做法,但我很确定这会对你有用

你可以这样做创建一个函数点击链接使用try并捕获如果找不到链接刷新页面集和计数器3次并刷新页面即使找不到刷新链接意味着抛出错误工作对我来说很完美 为要测试的所有链接编写相同的函数 并在下面的函数中使用等待代码所需的位置,这样您就不需要刷新3次

public void click_northland(){
       int Pagerefresh=0;
       String revtext=null;
       for(Pagerefresh=0;Pagerefresh<3;Pagerefresh++){
        try{
        HP.findElement(By.linkText("Northland")).click();
        HP.navigate().back();
        Pagerefresh=4;
        }
        catch(Exception e){
         HP.navigate().refresh();
       }
    }
    if(Pagerefresh==3){
        System.out.println("Error In Finding the link")
    }
}

谢谢,

请告诉我这是否适合您。