2016-10-18 3 views
2

click() 구현을 다음과 같이 사용하면 셀렌이 버튼을 누른 것처럼 동작하고 다음 화면이 표시됩니다. 그러나 웹 페이지는 클릭을받지 못하므로 다음 화면이 나타나지 않습니다. 실제로 무슨 일이 일어나고 있는지 이해하지 못하고 있습니다. 이전에이 문제가 발생했을 수도 있습니다.Selenium 3.0 ExpectedConditions 문제

public static void click(WebDriver driver, By by) { 
    new WebDriverWait(driver, DEFAULT_WAIT_FOR_ELEMENT) 
     .until(ExpectedConditions.elementToBeClickable(by)) 
     .click(); 
} 

주 : 여기를 클릭 구현의 이초의 Thread.sleep를 가진 버튼은 참으로 클릭합니다. 하지만 우리 모두 알다시피, 아무도 thread.sleep을 원한다.

주 2 :이 문제는 셀레늄에 자주 2.53

주 3 일이되지 않습니다 나는 현재 파이어 폭스 49.0.1를 사용하고을 geckodriver와 내가 당신에게 줄 것이다 0.11.1

답변

4

어떻게 구현해야하는지에 대한 예를 들어 보겠습니다.

기본 시간으로 time 매개 변수를 사용하여 기본 waitUntil 메소드를 작성합니다.

private void waitUntil(ExpectedCondition<WebElement> condition, Integer timeout) { 
    timeout = timeout != null ? timeout : 5; 
    WebDriverWait wait = new WebDriverWait(driver, timeout); 
    wait.until(condition); 
} 

그러면 도우미 메서드를 사용하여 표시 대기 시간을 만들거나 클릭 대기 시간을 설정할 수 있습니다.

public Boolean waitForIsDisplayed(By locator, Integer... timeout) { 
    try { 
     waitUntil(ExpectedConditions.visibilityOfElementLocated(locator), 
       (timeout.length > 0 ? timeout[0] : null)); 
    } catch (org.openqa.selenium.TimeoutException exception) { 
     return false; 
    } 
    return true; 
} 

elementToBeClickable과 비슷한 기능을 수행 할 수 있습니다.

public Boolean waitForIsClickable(By locator, Integer... timeout) { 
    try { 
     waitUntil(ExpectedConditions.elementToBeClickable(locator), 
       (timeout.length > 0 ? timeout[0] : null)); 
    } catch (org.openqa.selenium.TimeoutException exception) { 
     return false; 
    } 
    return true; 
} 

그래서 우리는 이것을 사용하기 위해 클릭 할 수있는 클릭 방법을 만들 수 있습니다

public void click(By locator) { 
    waitForIsClickable(locator); 
    driver.findElement(locator).click();    
} 

내가 더 적은을 만들기 위해 내 주장에 사람들을 다시 사용할 수 있기 때문에 waitForIsDisplayed 및 waitForIsClickable가 만드는 이유 다루기 힘든. 또한

assertTrue("Expected something to be found, but that something did not appear", 
      waitForIsDisplayed(locator)); 

, 당신은 방법 (오초)에 지정된 기본 시간 대기 방법을 사용하거나 수행 할 수 있습니다

waitForIsDisplayed(locator, 20); 
을 던지기 전에 20 초 최대를 기다릴 것

예외.

+0

문제는 단추가 표시되고 클릭 가능하므로 예외가 발생하지 않습니다. 이 문제를 볼 때 Selenium이 클릭 할 때 버튼에 기능이 없거나 Selenium의 클릭이 둔합니다. 나는 이것을 이해하려고 노력하고있다. Selenium 2.x에 돌아 왔고 정상적으로 작동합니다. –

+0

아직 디버깅을 시도하지 않았 으면합니다.또한 사용중인 로케이터를 확인하십시오. 클릭하려고 시도한 부모 또는 자녀를 사용하십시오. 나는 셀레늄 3에 대한 클릭 메쏘드에 대한 어떤 변화도 모르고있다. – Cromzinc

0

요소를 클릭 할 수 있는지 확인하는 동안 요소를 찾지 못했기 때문일 수 있습니다. elementToBeClickable의 구현에 따라 요소는 현재으로 가정합니다.

셀레늄 webdriver에 QMetry Automation Framework을 사용하는 것이 좋습니다. 확장 된 webdriver와 webelement을 제공하므로이 프레임 워크를 사용할 때 그러한 대기 시간을 사용할 필요가 없습니다. 당신이 정말로 기다릴 필요가있는 경우, 대기를위한 요소 레벨 메소드를 제공합니다. 예를 들어,

ele.waitForVisible() 
+0

엘리먼트를 찾았고, 엘리먼트를 클릭하고 다음 액션으로 넘어 갔다. 웹 페이지가 클릭을받지 못했습니다. 또는 실행 된 Selenium 클릭이 아무 효과가없는 빈칸이었습니다. –

+0

이 경우에는 'nativeEvents'기능을 시도해야합니다. 참조를 위해 [DesiredCapabilities] [https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities]를 참조하십시오. – user861594