[java] Selenium WebDriver가 현재 보이지 않는 요소를 클릭하도록 강제하는 방법은 무엇입니까?

FirefoxDriver와 함께 Selenium 2 Java API를 사용하고 있습니다. 양식을 채울 때 양식 입력에 따라 페이지에 확인란이 추가됩니다.

Selenium을 사용하여 해당 확인란을 클릭하는 것을 시뮬레이션하고 싶습니다. 요소는 일반 브라우저에서 볼 수 있고 사용할 수 있지만 셀레늄은 요소가 보이지 않는다고 주장합니다.

"Element is not currently visible and so may not be interacted with"

셀레늄이 요소의 보이지 않는 상태를 무시하도록 할 수 있습니까? Selenium이 보이지 않는 요소와 상호 작용하게하려면 어떻게해야합니까?



답변

Selenium은 다음 기준에 따라 요소가 표시되는지 여부를 결정합니다 (DOM 검사기를 사용하여 요소에 적용되는 CSS를 결정하고 계산 된 스타일을 확인하세요).

  • 가시성! = 숨김
  • display! = none (모든 상위 요소에 대해서도 확인 됨)
  • 불투명도! = 0 (요소 클릭시 선택되지 않음)
  • 높이와 너비가 모두> 0
  • 입력의 경우 속성 유형! = 숨김

요소가 해당 기준 중 하나와 일치합니다. 요소의 스타일을 변경할 수없는 경우 다음은 자바 스크립트로 강제로 수행 할 수있는 방법입니다 (Selenium2 API라고 말 했으므로 WebDriver를 가정합니다).

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);

그러나 그것은 자바 스크립트 이벤트를 발생시키지 않을 것입니다. 해당 입력에 대한 변경 이벤트에 의존하는 경우에도 발생해야합니다 (이를 수행하는 많은 방법, 해당 페이지에로드 된 자바 스크립트 라이브러리를 사용하는 것이 가장 쉽습니다).

가시성 검사의 출처-

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

이것을 정의하는 WebDriver 사양-

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean


답변

때때로 이것은 검색하려는 동일한 속성을 가진 페이지에 여러 요소가 있고 “잘못된 요소와 대화”하고 있음을 의미합니다.

요소를 : id 또는 : name (또는 : class)으로 고유하게 식별 할 수없는 경우 까다로울 수 있습니다.

때때로 : xpath로 요소를 검색하는 것이 도움이되며 어떤 경우에는 실용적이지 않습니다.

이러한 경우 기준과 일치하는 모든 요소를 ​​가져와 색인별로 올바른 요소를 참조해야 할 수 있습니다. 더럽지 만 작동합니다.

Ruby on Rails 앱의 Selenium / Watir를 사용하고 있으므로 제 경우에는 다음과 같은 예가 있습니다.

browser = Watir::Browser.new(:firefox, :profile => "default")
browser.goto("http://www.google.com/analytics")
# login
browser.divs(:text, "+ New Property").last.click

도움이 되었기를 바랍니다.


답변

비슷한 문제가 있었지만 뷰포트에 표시되지 않는 요소와 관련이 있습니다. 스크린 샷을 찍고 브라우저 창이 너무 좁아서 요소를 볼 수 없다는 것을 깨달았습니다. 나는 이것들 중 하나를했고 효과가 있었다.

driver.maximize_window()

참조 : WebDriver.maximize_window ()


답변

또는 Selenium Action Class를 사용하여 사용자 상호 작용을 시뮬레이션 할 수 있습니다.

    WebDriver = new FirefoxDriver();

    WebElement menu = driver.findElement(By.xpath("")); // the triger event element

    Actions build = new Actions(driver); // heare you state ActionBuider
    build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden
    WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element
    m2m.click();


답변

보이는 요소가 보이지 않는 것으로 인식되는 또 다른 경우가 있습니다.

  • 요소가 CSS로 변환 된 경우
  • 요소의 부모 요소가 CSS로 변환 된 경우

상호 작용하지 않으려는 요소가 CSS로 변환되었는지 확인하려면 CHROME에서 다음을 수행하십시오.

  1. 열린 검사관
  2. 흥미로운 요소 (또는 상위 요소, 아마도 div 요소) 찾기
  3. ‘계산 됨’탭을 선택합니다.
  4. 매개 변수가있는 경우 : webkit-transform : matrix (…) 이는 요소가 CSS로 변환되었음을 의미하며 셀레늄 2에서 보이는 요소로 인식되지 않을 수 있습니다.

답변

보이지 않는 것은 요소가 천천히 나타나야하는 타이밍 때문일 수도 있습니다. 이 경우 브라우저를 잠시 기다리게하면 도움이 될 수 있습니다.

예를 들어, 요소가 존재할 때까지 WebDriver가 대기 하도록하는 질문을 참조하십시오 .


답변

인터넷 익스플로러 9에서 셀레늄 2와 같은 문제가 있었지만 수정이 정말 이상합니다. 내 양식 내부의 입력을 클릭 할 수 없었습니다-> 셀레늄 반복은 보이지 않습니다.

내 양식에 곡선 그림자가있을 때 발생했습니다.-> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects : 콘크리트 “효과 2″에서

이 의사 요소 솔루션이 셀레늄 테스트를 중단 한 이유와 방법을 모르겠지만 저에게 효과적입니다.