2016-07-22 4 views
2

Я пытаюсь узнать селен, одна из проблем, которые у меня есть, ждет элементов, я объясню это.Selenium wait for a element

Я делаю java-программу для автоматического перевода с помощью google translate. Но из-за асинхронного характера перевода Google нет способа получить элемент, не дожидаясь его, код выходит из строя, потому что он не находит этот элемент, и этот элемент не существует в то время, когда это требует код. должен подождать немного, пока сервер не ответит на ваш запрос.

Я думаю, что это не эстриктная ситуация с селеном и веб-страницами, поэтому я считаю, что должен быть простой способ сделать это. К моменту, когда это код, который я создал для управления ситуацией.

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

Это работает, Thanks –

+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

Это работает, спасибо. Я выбрал ответ «Мозер» лучшим, потому что у вас больше очков, просто чтобы он стал расти :) –

+0

@DavidMarciel ok не проблема ... :) –