2017-10-25 11 views
1

Selenium, Watir 및 ChromeDriver를 사용하는 Ruby로 작성된 스크래핑 스크립트는 모두 Chrome 브라우저 창에서 제대로 작동하지만 헤드리스 모드로 실행하려고 시도합니다.왜 Watir Chrome Headless가 '포인트 (x, y)에서 클릭 할 수 없습니까?'

Selenium::WebDriver::Error::UnknownError: unknown error: Element <input id="desired_element" type="checkbox" name="desired_element" checked="checked"> is not clickable at point (660, 594). Other element would receive the click: <html lang="en">...</html> 

저는 Watir 6.8과 최신 Chromedriver 2.33을 사용하고 있습니다.

모든 아이디어 whats n = headless 대 headless가 아닌 페이지의 다른 동작 뒤에 있으며 어떻게 처리 할 수 ​​있습니까?

+0

실행에 실패한 실제 코드와 코드가 상호 작용하는 HTML 샘플을 포함하는 것이 도움이됩니다. –

답변

2

이 화면에 다른 요소는 당신이 상호 작용을 시도하고있는 체크 박스를 덮고 의미한다. 이것은 머리가없는 모드의 기본 브라우저 크기가 헤드가없는 상태로 실행될 때 브라우저의 기본 크기와 달라서 요소의 배열이 달라지는 결과로 발생합니다.

헤드리스 모드와 일반 모드에서 창의 크기를 묻고 결과 값이 같은지 확인합니다.

size = browser.window.size 
puts "The browser window is #{size.width} wide by #{size.height} high" 

는이 문제를 해결하기 위해 몇 가지 잠재적 인 방법이 있습니다 :

  1. 가 지정하거나 브라우저 창에서 '크기를 변경합니다. 예를 들어, browser.window.resize_to 1024, 768 나는 이것을 선호하며 일반적으로 브라우저 크기를 초기화 한 후 브라우저 크기로 설정하는 것과 같은 명령을 사용합니다. 귀하의 사이트에 대한 지원되는 최소 크기 중 하나를 설정하거나 최소 크기

  2. @browser.checkbox(name: "desired_element").send_keys " "

    내가하지 않습니다 같은 그것을 공간을 보내는 것과 같은, 체크 박스를 '클릭'다른 수단을 사용하는 것이 좋습니다 스크립트가 진행될 때 사이트의 다른 요소와 상호 작용하는 다른 유사한 문제가 발생할 수 있으므로 문제의 원인을 실제로 해결하지는 않기 때문에이 방법을 사용하십시오.

+0

헤드가없는 창 크기를 창과 일치시키는 감사 Chuck size 'with head'(정확한 용어 ?!)는 여기에서 완벽하게 작동했습니다. 오류 메시지가 다른 요소가 원하는 요소의 예상 위치에 있다는 것을 알았지 만 이해할 수없는 이유와 문제점을 해결하는 방법을 알 수 없었습니다. 그 구멍에서 나를 도와 줘서 고마워. 나는 Watir이 요소의 위치를 ​​기록하는 방법을 이해하지 못한다. 페이지로드시이를 수행 하는가? 따라서 javascript 요소가 dom을 변경하면 요소가로드 위치의 첫 번째 위치에서 위치를 바꿀 때 문제가 발생할 수있다. – jbk

+0

나는 watir 'logs'위치를 믿지 않는다. 나는 DOM에서 그것들을 얻는다 고 생각한다. (기술적으로 webdriver가 작업을하고있다.) 여기서 일어난 일은 브라우저 너비에 반응하고 페이지를 적합하고 멋지게 재구성하는 "반응"사이트의 드문 문제는 아닙니다. 종종 지원하는 최소 너비가 있습니다. 브라우저가 너비 아래 있으면 페이지에 깔끔하게 맞출 수 없기 때문에 많은 오브젝트가 겹쳐집니다. –

+0

헤드리스 상태에서 어떤 일이 발생했는지 보려면 위의 명령을 사용하여 헤드리스 브라우저의 기본 크기를 확인하십시오. 그런 다음 IRB에서 헤드리스 세션이 아닌 세션을 시작하고 두 번째 명령을 사용하여 헤드리스 브라우저가 사용했던 것과 동일한 크기로 창을 설정하십시오. 그런 다음 브라우저가 그 크기 일 때 페이지 정렬 방식과 겹칠 요소를 볼 수 있습니다. –

-2

이러한 종류의 오류의 이유는 웹 페이지가 요소를 찾을만큼 충분히로드되지 않기 때문입니다. 당신은 당신이 머리가없는 사실 이러한 문제 때문에 .click(), .send_keys

.send_keys(selenium.webdriver.common.keys.Keys.SPACE) 

당신이 .send_keys을 (사용

)는 히트 수와 .click 교체 시도하십시오이 될 수 있었을 때 시험 이전에 통과 언급했듯이 요소를 찾지 못하면 다시 한 가지 문제가 발생합니다.이 문제를 해결하려면 요소를 찾아야합니다.

elements = driver.find_element_by_tag_name("html") 
elements.send_keys(Keys.SPACE) 

희망이 도움이 될 것입니다. 오류 메시지가 "다른 요소가 클릭을받을 것이다"라고 할 때 문제가 무엇인지를 말하고있다

+0

요소가 발견 된 것 같습니다. 그렇지 않으면 요소가 오류를 발견하지 못할 것입니다. 대신 그것은 점 (x, y)에서 클릭 할 수없는 요소를 제공합니다. '오류는 요소가 원래 위치했던 위치에서 이동했음을 나타냅니다. 예를 들어, 페이지의 이전 요소는 첫 번째로드시 'desired_element'의 위치를 ​​페이지로 변경하는 다른 요소를 팝하는 조건부입니다. 이것이 나에게 일어날 수있는 것처럼 보이지만 '머리'모드에서 이와 동일한 문제는 발생하지 않습니다. – jbk

+0

먼저 요소를 찾거나 send_keys를 찾지 마십시오. FYI 실제 코드 I; 실행하려고하는 m은; '@ browser.checkbox (name : "desired_element"). clear' – jbk

+0

사용자가 Watir을 사용하고 있음을 분명하게 표시했기 때문에 downvoted가 응답하지만 Watir API가 아닌 Selenium API를 사용하여 표현되었습니다. –