Programming

"요소를 클릭 할 수 없음"오류 디버깅

procodes 2020. 2. 28. 19:36
반응형

"요소를 클릭 할 수 없음"오류 디버깅


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



반응형