2016-07-22 117 views
2

我想学习硒,我有一个问题是等待元素,我会解释它。硒等元素

我正在做一个Java程序,使用谷歌翻译自动翻译。 但由于谷歌翻译的异步性质,没有办法在没有等待的情况下获取元素,代码崩溃是因为它没有找到元素,并且元素在代码需要时不存在,所以您必须稍等一会,直到服务器响应您的请求。

我认为这不是一个疏远的情况处理硒和网页,所以我认为必须有一个简单的方法来做到这一点。 到目前为止,这是我创建的用于管理情况的代码。

public void translation(String s) { 

    System.setProperty("webdriver.chrome.driver", "C:\\Robots\\chromedriver.exe"); 

    WebElement webDriver = new ChromeDriver(); 

这是代码我觉得应该有一个更好的方式做,

我使用的方法要等到翻译准备

waitForElement("//*[@id='result_box']"); 


    System.out.println("prhase: " + s + " tranlsation: " + response.getText()); 

    webDriver.close(); 
} 

private void waitForElement(String element) { 
    WebElement response; 
    do { 
     try { 
      Thread.sleep(300); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     response = webDriver.findElement(By.xpath(element)); 

    } while (response.getText().isEmpty()); 
} 

灿你说我怎么容易吗?

+1

有一个多等待方法来等待一个元素引用这个链接http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp它会帮助你。 –

回答

2

你正在使用Thread.sleep而不是实际上等待元素,它只是等待3秒。

你可以这样做,而不是。

private void waitForElement(String element) { 
WebDriverWait wait = new WebDriverWait(Driver, 10); // Wait for 10 seconds. 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element))); 
WebElement element = driver.findElement(By.xpath(element)); 

} 

除非您期待奇怪的事情发生,否则不需要try/catch块。上面的代码将等待该元素出现10秒。不确定是否需要使用最后一行代码。

希望它有帮助!

+0

It works, 谢谢 –

+1

没问题,祝你好运! – Moser

1

而不是使用Thread.sleep()while你应该尝试使用WebDriverWait要等到与ExpectedConditions.visibilityOfElementLocated如下的: -

private WebElement waitForElement(String element) { 
    WebDriverWait wait = new WebDriverWait(webDriver, 10); //It will wait upto 10 seconds 

    return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element))); 
} 

现在你可以修改你的translation方法如下: -

public void translation(String s) { 

    System.setProperty("webdriver.chrome.driver", "C:\\Robots\\chromedriver.exe"); 

    WebElement webDriver = new ChromeDriver(); 
    WebElement response = waitForElement("//*[@id='result_box']"); 

    System.out.println("prhase: " + s + " tranlsation: " + response.getText()); 

    webDriver.close(); 
} 

希望它有助于.. :)

+0

它的工作原理,谢谢。我选择了“Moser”作为最好的答案,因为你有更多的积分,只是为了让他成长:) –

+0

@DavidMarciel ok没问题... :) –