"요소를 클릭 할 수 없음"오류 디버깅
Chrome에서만 볼 수 있습니다.
전체 오류 메시지는 다음과 같습니다.
"org.openqa.selenium.WebDriverException : 지점 (411, 675)에서 요소를 클릭 할 수 없습니다. 다른 요소는 클릭을받습니다 : ..."
'클릭을받을 수있는'요소는 해당 요소의 윗면이 아니라 겹치지 않고 페이지 주위를 이동하지 않는 요소의 측면입니다.
오프셋을 추가하려고 시도했지만 작동하지 않습니다. 항목은 스크롤 할 필요없이 표시된 창에 있습니다.
다음 세 가지 유형이 있습니다.
1. 요소가 클릭되어 보이지 않습니다.
클릭하도록 Actions 또는 JavascriptExecutor 를 사용 하십시오.
행동 별 :
WebElement element = driver.findElement(By("element_path"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
JavascriptExecutor로 :
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); // if the element is on top.
jse.executeScript("scroll(0, 250)"); // if the element is on bottom.
또는
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView()", Webelement);
그런 다음 요소를 클릭하십시오.
2. 요소를 클릭하기 전에 페이지가 새로 고쳐집니다.
이를 위해 페이지를 몇 초 동안 기다리십시오.
3. 요소를 클릭 할 수 있지만 그 위에 회 전자 / 오버레이가 있습니다.
아래 코드는 오버레이가 사라질 때까지 기다립니다.
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
그런 다음 요소를 클릭하십시오.
JavaScript 클릭을 사용할 수도 있으며 스크롤이 필요하지 않습니다.
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
chromedriver에 버그가있는 것 같습니다 (문제는 수정되지 않은 것으로 표시되어 있음)-> GitHub Link
( 아마도 FreedomSponsors에 현상금을 배치 하시겠습니까?)
의견 # 27에서 제안 된 해결 방법이 있습니다. 아마 당신을 위해 일할 것입니다.
나는 같은 문제가 있었고, 제공된 모든 솔루션을 시도했지만 그들은 나를 위해 작동하지 않았다. 결국 나는 이것을 사용했다 :
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));
도움이 되었기를 바랍니다
셀레늄 구동 크롬 창이 너무 작게 열린 상황에서 이것을 보았습니다. 클릭 할 요소가 뷰포트에서 벗어 났으므로 실패했습니다.
그것은 논리적으로 들립니다 ... 실제 사용자는 요소를보고 실제로 클릭 할 수 있도록 창 크기를 조정하거나 스크롤해야합니다.
창 크기를 적절하게 설정하도록 셀레늄 드라이버에 지시 한 후이 문제는 사라졌습니다. 웹 드라이버 API는 여기 에 설명되어 있습니다 .
와우, 여기에 많은 답변과 많은 좋은 답변이 있습니다.
나는 내 경험에서 이것에 무언가를 추가하기를 바랍니다.
글쎄, 내 경우에는 때때로 요소를 숨기는 쿠키 오버레이가있었습니다. 요소로 스크롤해도 작동합니다. 그러나 내 겸손한 의견 (내 경우에는 모든 사람을위한 만병 통치약이 아님)에서 가장 간단한 해결책은 전체 화면으로 이동하는 것입니다 (화면 창의 3/4에서 스크립트를 실행 중이었습니다)! 그래서 우리는 간다 :
driver.manage().window().maximize();
희망이 도움이됩니다!
루비 / watir-webdriver / chrome
다음 트릭을 사용하고 작동하는 것 같습니다.
#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"
# click myelement
myelement.when_present.fire_event("click")
나도이 문제와 씨름했다. FF에서 코드가 제대로 작동하고 Chrome에서 실패합니다. 내가하려고했던 것은 틱 박스를 클릭하는 것이 었습니다.보기가 보이지 않으면 스크롤하여 보았습니다. Chrome에서보기로 스크롤해도 Chrome의 하단 픽셀 만 표시되지 않으므로 웹 드라이버가 클릭을 거부했습니다.
내 해결 방법은 다음과 같습니다.
WebElement element = _sectorPopup.findElement(...);
((Locatable) element).getCoordinates().inViewPort();
try {
element.click();
} catch (Exception e) {
new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
element.click();
}
또한 Chrome에는 sendKeys에 문제가 있으며 때때로 동작을 사용해야합니다. 분명히, 마일리지가 다를 수 있도록 어느 방향과 얼마를 가야하는지 알아야합니다. 그러나 나는 이것을 자바 스크립트 해킹보다 선호하므로 다른 누군가가 유용하다고 생각하는 경우 여기에 게시하고 있습니다.
xvfb-run으로 헤드리스 테스트를 실행할 때이 오류가 발생했습니다. 그들은 완벽하게 현지에서 일하고있었습니다. 크롬을 사용하면 웹 드라이버 / 크롬 드라이버 / 크롬 / 자바 등의 버전이 모두 동일합니다.
Tony Lâmpada가 지적한 chromedriver- GitHub Link의 '수정하지 않음'버그 는 화면에 표시되거나 보이지 않는 것과 관련이 있다고 제안했습니다.
xvfb-run에 대한 도움말 메시지는 다음을 보여줍니다.
-s ARGS --server-args=ARGS arguments (other than server number and
"-nolisten tcp") to pass to the Xvfb server
(default: "-screen 0 640x480x8")
xvfb의 해상도를 변경하면 오류가 사라졌습니다.
xvfb-run -s "-screen 0 1280x1024x16" ...
각도기를 사용할 때 도움이되었습니다.
var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
먼저 최신 Chrome 드라이버를 다운로드하여 문제가 해결되는지 확인하십시오.
제 경우에는 문제가 해결되지 않았습니다. 그러나 다음 솔루션은 지금까지 효과적이었습니다. 다음은 C # 코드이지만 특정 언어에서 동일한 논리를 따를 수 있습니다. 우리가 여기서하는 일은
1 단계 : Selenium Actions 객체를 사용하여 요소에 집중
2 단계 : 그런 다음 요소를 클릭하십시오.
3 단계 : 예외가있는 경우 Selenium 브라우저 드라이버의 "ExecuteScript"메소드를 통해 javascript 스크립트를 실행하여 요소에서 javascript "Click"이벤트를 트리거합니다.
1 단계와 2 단계를 건너 뛰고 3 단계 만 시도해도됩니다. 3 단계는 자체적으로 작동하지만 3 단계에서는 요소를 성공적으로 클릭했지만 요소를 클릭 한 후 코드의 다른 부분에서 예기치 않은 동작이 발생하는 한 시나리오에서 이상한 동작을 발견했습니다.
try
{
//Setup the driver and navigate to the web page...
var driver = new ChromeDriver("folder path to the Chrome driver");
driver.Navigate().GoToUrl("UrlToThePage");
//Find the element...
var element = driver.FindElement(By.Id("elementHtmlId"));
//Step 1
new Actions(driver).MoveToElement(element).Perform();
//Step 2
element.Click();
}
catch (Exception)
{
//Step 3
driver.ExecuteScript("document.getElementById('elementHtmlId').click();");
}
Tony Lâmpada의 답변에 대한 의견을 바탕 으로이 방법을 만들었습니다. 잘 작동합니다.
def scroll_to(element)
page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
파이썬에서 셀레늄 스크립트를 실행하는 동안 동일한 문제가 발생했습니다. 다음은 요소를 클릭하는 데 사용한 것입니다.
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).click(element).perform()
나는 두 개의 확인란을 하나씩 차례로 확인 해야하는 비슷한 문제에 직면하고 있었지만 위의 오류가 동일하게 발생했습니다. 따라서 확인란을 확인하는 단계 사이에 대기를 추가했습니다 .... 잘 작동합니다. 단계는 다음과 같습니다.
When I visit /administrator/user_profiles
And I press xpath link "//*[@id='1']"
Then I should see "Please wait for a moment..."
When I wait for 5 seconds
And I press xpath link "//*[@id='2']"
Then I should see "Please wait for a moment..."
When I visit /administrator/user_profiles_updates
이것은 Chrome 드라이버 바이너리의 "수정하지 않음"버그의 결과입니다.
나를 위해 일한 하나의 솔루션 (Our Mileage May Vary)은이 Google 그룹 토론, 의견 # 3에서 찾을 수 있습니다.
https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc
관련 부분은 바로 여기에 있습니다 :
이후 스팬의 상위 앵커의 href로 직접 이동하여 문제를 해결했습니다.
driver.Navigate (). GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)). FindElement (By.XPath ( "..")). GetAttribute ( "href"));
필자의 경우 Python을 사용하고 있으므로 원하는 요소를 얻으면 간단히 사용했습니다.
driver.get(ViewElm.get_attribute('href'))
그러나 클릭하려는 요소가 링크 인 경우에만 작동합니다.
clj-webdriver (clojure port of Selenium) 와 동일한 문제에 직면했습니다 . 편의상 이전 솔루션을 클로저로 번역했습니다. 클릭이나 그 문제를 피하기 위해 무엇이든하기 전에이 함수를 호출 할 수 있습니다.
(defn scrollTo
"Scrolls to the position of the given css selector if found"
[q]
(if (exists? q)
(let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ]
(execute-script jscript))))
드라이버가 클릭하려고하는 동안 요소의 위치가 변경되면 IE 에서이 요소를 보았습니다. 드라이버는 초기 위치를 유지하지만 실제로 클릭 할 때까지 해당 위치는 더 이상 해당 요소를 가리 키지 않습니다. FireFox 드라이버에는이 문제 BTW가 없습니다. 분명히 프로그래밍 방식으로 요소를 "클릭"합니다.
어쨌든 애니메이션을 사용하거나 단순히 요소의 높이를 동적으로 변경하면 (예 :) 발생할 수 있습니다 $("#foo").height(500)
. 높이가 "정착"된 후에 만 요소를 클릭해야합니다. 나는 다음과 같은 코드 (C # 바인딩)로 끝났습니다.
if (!(driver is FirefoxDriver))
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}
쉽게 쿼리 할 수없는 애니메이션 또는 기타 요소의 경우 요소가 정지 될 때까지 기다리는 "일반적인"방법을 사용할 수 있습니다.
var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d =>
{
var e = driver.FindElement(By.Id(someId));
if (e.Location == prevLocation)
{
stationaryCount++;
return stationaryCount == desiredStationarySamples;
}
prevLocation = e.Location;
stationaryCount = 0;
return false;
});
이 요소에 로딩 대화 상자가 있기 때문에 이것을 만났습니다. this 요소로 작업하기 전에 대기를 추가하여 간단히 해결합니다.
try {
Thread.sleep((int) (3000));
} catch (InterruptedException e) {
//
e.printStackTrace();
}
이 도움을 바랍니다!
오류 메시지 설명 :
클릭하려는 요소가 있지만 표시되지 않는다는 오류 메시지가 나타납니다. 무언가 보이지 않거나 일시적으로 보이지 않을 수 있습니다.
테스트 순간에 요소가 보이지 않는 데는 여러 가지 이유가있을 수 있습니다. 페이지를 다시 분석하고 사례에 적합한 솔루션을 찾으십시오.
특별한 경우에 대한 해결책 :
필자의 경우, 방금 클릭 한 화면 요소의 툴팁이 다음에 클릭하려는 요소 위에 팝업되었을 때이 오류가 발생합니다. Defocus 는 내가 필요한 솔루션이었습니다.
- 초점을 맞추지 않는 빠른 솔루션 은 화면의 다른 부분에서 "아무것도"하지 않는 다른 요소를 클릭하는 것입니다. 클릭 동작 후에는 아무 일도 일어나지 않습니다.
- 적절한 해결책 은
element.blur()
툴팁을 띄우는 요소 를 호출 하여 툴팁이 사라지는 것입니다.
이 오류의 원인은 클릭하려는 요소가 브라우저의 뷰포트 (사용자가 볼 수있는 영역)에 없기 때문입니다. 이를 극복하는 방법은 먼저 원하는 요소로 스크롤 한 다음 클릭을 수행하는 것입니다.
자바 스크립트 :
async scrollTo (webElement) {
await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
await this.driver.executeScript('window.scrollBy(0,-150)')
}
자바:
public void scrollTo (WebElement e) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
js.executeAsyncScript('window.scrollBy(0,-150)')
}
Re Tony Lâmpada의 답변, 의견 # 27은 Java 코드를 제공하고 Python이 필요하다는 점을 제외하고는 실제로 문제를 해결했습니다. 다음은 요소의 위치로 스크롤 한 다음 클릭하는 Python 함수입니다.
def scroll_to_and_click(xpath):
element = TestUtil.driver.find_element_by_xpath(xpath)
TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
element.click()
이것은 Chrome 34.0의 문제를 해결했습니다. Firefox 28.0 및 IE 11에서는 아무런 영향을 미치지 않습니다. 이러한 브라우저에는 문제가 없지만 클릭하기 전에 요소의 위치로 스크롤하는 것은 여전히 나쁜 일이 아닙니다.
어쩌면 실제로 깨끗한 솔루션은 아니지만 작동합니다.
try:
el.click()
except WebDriverException as e:
if 'Element is not clickable at point' in e.msg:
self.browser.execute_script(
'$("{sel}").click()'.format(sel=el_selector)
)
else:
raise
호버를 테스트 한 후 툴팁 아래의 링크를 클릭해야했기 때문에이 버그가 발생했습니다. 해결책은 툴팁을 없애기 위해 page.find('.sp-logo').hover
이전 에 추가하는 것이 었습니다 click_link
.
재미 있고, 다양한 반응을 보며 시간을 보냈을 때, 아무도 분명하게 시도한 적이 없었습니다. 내 페이지와 같이 동일한 ID가 여러 번 사용 된 경우 ( "newButton") 원하는 것이 처음 발견 된 것이 아니라면이 오류가 발생할 가능성이 높습니다. 가장 쉬운 방법 (C #) :
var testIt = driver.FindElements(By.Id("newButton"));
FindElement가 아니라 FindElements입니다.
그런 다음 검색 결과에서 몇 개의 결과가 나왔는지 테스트하십시오. 두 번째 경우 다음을 사용할 수 있습니다.
testit[1].Click();
또는 ID를 재사용 한 사람이 문제를 해결하도록하십시오.
언급 된 모든 제안을 테스트 한 후에는 아무 효과가 없습니다. 이 코드를 만들었습니다. 작동하지만 아름답지는 않습니다.
public void click(WebElement element) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
element.click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
public void click(String css) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
driver.findElement(By.cssSelector(css)).click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
나는 일종의 무차별 클릭을하고 그것은 나를 위해 작동합니다.
try:
elem.click()
except:
print "failed to click"
size = elem.size
mid_of_y = int(size["height"])/2
stepts_to_do_to_left = int(size["width"])
while stepts_to_do_to_left > 0:
try:
print stepts_to_do_to_left, mid_of_y
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
action.click()
action.perform()
print "DONE CLICK"
break
except:
pass
jQuery
페이지에로드 한 경우 다음 javascript 명령을 실행할 수 있습니다.
"$('#" + element_id + "').click()"
Python executor를 사용하는 예 :
driver.execute_script("$('#%s').click()" % element_id)
나는 같은 문제가 있었고 div와 div 내부의 링크 사이의 ID 충돌로 인해 발생했습니다. 그래서 드라이버는 내가 원하는 링크 대신 div를 클릭하고있었습니다. div ID를 변경했는데 제대로 작동했습니다.
전에:
<div id="logout"><a id="logout" href="logoutLink">logout</a></div>
후:
<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
이 문제가 발생하여 클릭 한 요소 앞에 div를 표시하는 요소를 클릭하면 (제 경우에는) 발생하는 것 같습니다. 클릭을 큰 '올 트라이 캐치 블록'으로 감싸서이 문제를 해결했습니다.
셀레늄을 사용할 때 Drupal에서 :
// Get element.
$element = $this->driver->getElement('xpath=//input');
// Get screen location.
$location = $element->getLocation();
// To make sure that Chrome correctly handles clicking on the elements
// outside of the screen, we must move the cursor to the element's location.
$this->driver->moveCursor($location['x'], $location['y']);
// Optionally, set some sleep time (0.5 sec in the example below) if your
// elements are visible after some animation.
time_nanosleep(0, 500000000);
// Click on the element.
$element->click();
참고 URL : https://stackoverflow.com/questions/11908249/debugging-element-is-not-clickable-at-point-error
'Programming' 카테고리의 다른 글
데이터베이스 필드의 표준 길이 목록 (0) | 2020.02.28 |
---|---|
안드로이드의 싱글 톤과 애플리케이션 컨텍스트? (0) | 2020.02.28 |
소스에서 R 패키지를 설치하려면 어떻게합니까? (0) | 2020.02.28 |
왜 finalize ()를 구현하겠습니까? (0) | 2020.02.28 |
모드를 찾기위한 내장 함수가 있습니까? (0) | 2020.02.28 |