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


396

Chrome에서만 볼 수 있습니다.

전체 오류 메시지는 다음과 같습니다.

"org.openqa.selenium.WebDriverException : 지점 (411, 675)에서 요소를 클릭 할 수 없습니다. 다른 요소는 클릭을받습니다 : ..."

'클릭을받을 수있는'요소는 해당 요소의 윗면이 아니라 겹치지 않고 페이지 주위를 이동하지 않는 요소의 측면입니다.

오프셋을 추가하려고 시도했지만 작동하지 않습니다. 항목은 스크롤 할 필요없이 표시된 창에 있습니다.


2
페이지가로드 될 때까지 기다리십니까? 페이지가로드되는 동안 다른 요소가 겹칠 수 있습니까?
Herokiller

55
방금 도착한 사람들을위한 짧은 이야기-요소가 페이지에 표시되지 않으며 클릭 할 수 없습니다. VIEWPORT by EMITTING 창을 스크롤해야합니다.
Chris B. Behrens

67
@ ChrisB.Behrens 항상 그런 것은 아닙니다. 이 특정 오류는 요소가 다른 요소로 덮여있을 때도 발생할 수 있습니다. 자세가 고정 된 다른 요소 인 버튼을 클릭하려고 할 때이 예외가 발생했습니다.
Martin Cassidy 2016 년

4
Chromedriver뿐만 아니라 Firefox에서도 동일한 문제가 발생했습니다. 위의 다른 사람들이 제안한 것처럼 페이지가 완전히 다시로드 될 때까지 대기 지연을 구현하여 문제를 해결했습니다.
Codervince

5
나는 이것이 scrollTo를 방출하거나 대기하는 것이 절대적으로 잘못된 조언이라고 생각합니다. 셀레늄 클릭 알고리즘은 다음과 같습니다. 1. 요소 위치 계산 2. scroll이 위치로 이동 (따라서 직접 발행 할 필요 없음) 3.이 위치로 클릭 (마지막 어설 션에서 제외). 실제 클릭 이벤트 전송 직전 위치) 내 조언은 다음과 같습니다. 1. 요소가 뷰포트 안에 있는지 확인합니다. 2. 고정 된 메뉴와 같이 다른 요소가 요소를 덮고 있는지 확인하고,있는 경우 숨기거나 내장 된 scrollTo에 의존하지 않고 클릭하기 전에 수동으로 스크롤하십시오.
Vitalik Verhovodov 12

답변:


325

다음 세 가지 유형이 있습니다.

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));

그런 다음 요소를 클릭하십시오.


52
세 번째 유형의 원인이 있는데, 이는 요소가 div 또는 범위에 싸여 있다는 것입니다. 페이지를 완전히로드하고 뷰포트 내에 완전히로드 할 수 있지만 Chromedriver는 FF 및 IE 용 웹 드라이버에 문제가없는 경우 클릭을 거부합니다. 실제 사람은 범위가 존재한다는 단서가 없으며 브라우저는 사용자가 실제로 클릭했을 때 신경 쓰지 않습니다. 돌아 다니거나 기다리지 않아도이 문제는 해결되지 않습니다. Chrome / chromedriver를 피하거나 페이지의 HTML을 다시 작성하십시오. 사례 3의 경우 사람들에게 유일한 옵션 인 것 같습니다.
Don Simon

54
@DonSimon 나는 당신과 같은 문제가있었습니다. 클릭 대신 .SendKeys (Keys.Return)를 사용하여 문제를 해결할 수있었습니다. 이것은 내가이 문제를 겪고있는 Chrome 과이 특정 링크 (Div에 싸여있는 앵커)에 대해 비슷한 문제가있는 Firefox에서 나에게 효과적이었습니다.
피터 버니어

17
@PeterBernier가 제안한 솔루션은 요소가 div 또는 span으로 싸여있는 경우 잘 작동합니다. 파이썬에서는 .send_keys ( '\ n')을 사용하여 클릭을 시뮬레이션하고 Chrome의 문제를 해결했습니다.
GJ

4
요소가 div 요소에 의해 숨겨져 있으면 다음 코드는 수정합니다. executeJavascript ( "arguments [0] .click ();", selenium.findElement (locator));
EsotericNonsense

요소를 클릭 할 수있을 때까지 기다릴 수도 있습니다. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));까지
Chielus

67

JavaScript 클릭을 사용할 수도 있으며 스크롤이 필요하지 않습니다.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);

5
믿을 수 없는! isDisplayed () 및 isEnabled ()가 요소를 클릭하기에 충분하지 않은 조건이있는 경우 셀레늄이 제공하는 click () 메소드를 휴지통으로 옮기지 않는 이유가 궁금합니다. 이것이 유일한 해결책 인 것 같습니다. 감사!
Giovanni Bitliner

2
+1 : 이것은 나를 위해 일한 솔루션입니다. actions.MoveToElementC #에서 저에게 효과가 없었고 다른 스크롤 솔루션은 스크롤이 요소를 올바르게 볼 수 없거나 페이지의 요소 위치가 변경 될 수 있다는 점에서 약간 취약했습니다.
사용자

1
이 솔루션은 요소가 보이지 않지만 페이지에 존재하는 경우 가장 쉬운 방법입니다.
Yashveer Rana

@Giovanni Bitliner이 방법은 실제 사용자 시나리오가 아니기 때문에이 방법을 제공하지 않습니다. 로더가 사라질 때까지 기다려야합니다. 나는 이것이 셀레늄에 관한 훌륭한 것이라고 생각합니다.
기드온 멀더

+1 또한 나를 위해 일했다. 내 코드에 flwg 메소드를 추가했습니다 :`private void jsClick (IWebElement 요소, IWebDriver 드라이버) {IJavaScriptExecutor ex = (IJavaScriptExecutor) driver; ex.ExecuteScript ( "인수 [0] .click ();", 요소); }`이런 식으로 호출 : 'jsClick (driver.FindElement (By.XPath ( "xpathOfTheElement"))); `
Jeremias

46

chromedriver에 버그가있는 것 같습니다 (문제는 수정되지 않은 것으로 표시되어 있음)-> GitHub Link

( 아마도 FreedomSponsors에 현상금을 배치 하시겠습니까?)

의견 # 27에서 제안 된 해결 방법이 있습니다. 어쩌면 그것은 당신을 위해 일할 것입니다-


4
공정한 것 같습니다-버튼이 화면에 없으면 실제로 클릭 할 수 없습니다.
Evan Knowles

이것은 버그가 아닙니다. 이것은 의도 된 동작이며 정확합니다. 다른 제안대로 요소가 뷰포트 외부에 있으면 스크롤해야합니다.
Alex Skrypnyk

Firefox를 사용해 보니이 오류가 발생하지 않았지만 클릭은 여전히 ​​무시되었습니다. 부모 div의 높이는 0이었습니다. 그 문제가 해결되면 모두 잘 작동했습니다.
dansalmo

35

나는 같은 문제가 있었고, 제공된 모든 솔루션을 시도했지만 그들은 나를 위해 작동하지 않았다. 결국 나는 이것을 사용했다 :

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));

도움이 되었기를 바랍니다


16

셀레늄 구동 크롬 창이 너무 작게 열린 상황에서 이것을 보았습니다. 클릭 할 요소가 뷰포트에서 벗어 났으므로 실패했습니다.

그것은 논리적으로 들립니다 ... 실제 사용자는 요소를보고 실제로 클릭 할 수 있도록 창 크기를 조정하거나 스크롤해야합니다.

창 크기를 적절하게 설정하도록 셀레늄 드라이버에 지시 한 후이 문제는 사라졌습니다. 웹 드라이버 API는 여기 에 설명되어 있습니다 .


15

와우, 여기에 많은 답변과 많은 좋은 답변이 있습니다.

나는 내 경험에서 이것에 무언가를 추가하기를 바랍니다.

글쎄, 내 경우에는 때때로 요소를 숨기는 쿠키 오버레이가있었습니다. 요소로 스크롤해도 작동합니다. 그러나 내 겸손한 의견 (제 경우에는 모든 사람을위한 만병 통치약이 아님)에서 가장 간단한 해결책은 전체 화면으로 이동하는 것입니다 (화면 창의 3/4에서 스크립트를 실행 중이었습니다)! 그래서 우리는 간다 :

driver.manage().window().maximize();

희망이 도움이됩니다!


13

루비 / 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")

1
내가 본 문제는 지역지도와 관련이 있습니다. 오류는 여기의 원래 게시물과 같습니다. 클릭해야 할 영역의 "앞"에 div가 있습니다. AJAX / 타이밍 / 페이지로드 문제가 아니며 해당 영역이 전체 화면으로 표시되어 스크롤 할 수 없었습니다. 그러나 클릭 방법을 object.click에서 object.fire_event ( "click")로 변경하면 문제가 해결 된 것으로 보입니다. Firefox가 정상적으로 클릭하는 방식에 영향을 미치지 않도록 begin / rescue 블록에 두었습니다.
adam reed

이 접근법은 뷰포트에 보이지 않는 요소가있을 때 문제를 해결했습니다.
Jason R. Coombs 1

13

나도이 문제와 씨름했다. 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에 문제가 있으며 때때로 동작을 사용해야합니다. 분명히, 마일리지가 다를 수 있도록 어느 방향과 얼마를 가야하는지 알아야합니다. 그러나 나는 이것을 자바 스크립트 해킹보다 선호하므로 다른 누군가가 유용하다고 생각하는 경우 여기에 게시하고 있습니다.


Locatable은 더 이상 사용되지 않습니다.
Steve Staple

12

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" ...

9

각도기를 사용할 때 도움이되었습니다.

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();

8

먼저 최신 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();");

            }

나는이 같은 문제가 발생했습니다. Actions 클래스를 사용하는 1 단계는 훌륭합니다. 나는 이것을 생각하지 않았을 것입니다. 감사!
코너 코너

첫 번째 단계는 훌륭한 솔루션입니다.
Sovandara LENG

7

Tony Lâmpada의 답변에 대한 의견을 토대로이 방법을 만들었습니다. 잘 작동합니다.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end

6

파이썬에서 셀레늄 스크립트를 실행하는 동안 동일한 문제가 발생했습니다. 다음은 요소를 클릭하는 데 사용한 것입니다.

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()

5

나는 두 개의 확인란을 하나씩 차례로 확인 해야하는 비슷한 문제에 직면하고 있었지만 위의 오류가 동일하게 발생했습니다. 단계는 다음과 같습니다.

  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

이것을 추가하면 Gherkin 구문을 사용하는 적절한 방법이 아닙니다. 단계는 "주어진시기"와 같은 형식이어야하며 혼합해서는 안됩니다. "그런 다음"이후에 더 많은 "위험"이 필요한 경우 별도의 테스트 사례가 필요할 수 있습니다.
Floella

5

해당 요소에 초점을 맞추거나 스크롤해야합니다. explict wait를 사용해야 할 수도 있습니다.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

또는

스피너 / 오버레이로 인해 요소를 클릭 할 수 없습니다.

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

또는

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

또는

여전히 작동하지 않는 경우 JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);

3

이것은 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'))

그러나 클릭하려는 요소가 링크 인 경우에만 작동합니다.


3

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))))

3

드라이버가 클릭하려고 시도하는 동안 요소의 위치가 변경되면 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;
});

이것은 내가 겪고있는 것으로 보입니다. OP의 "Other Element would ..."예외가 간헐적으로 발생하지만 스크린 샷은 모달이 화면에 표시되고 요소가 적용되지 않고 클릭하기 전에 대기를 사용함을 보여줍니다. 클릭 한 모달이 열리면 실제로 페이지 아래로 슬라이드됩니다. 셀레늄이 실제 샘플 DOM을 기다리는 시점에 따라, 모달이 움직이면서 모달에 걸리면 예외가 발생할 수 있습니다.
Levi Noecker

3

이 요소에 로딩 대화 상자가 있기 때문에 이것을 만났습니다. this 요소로 작업하기 전에 대기를 추가하여 간단히 해결합니다.

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

이 도움을 바랍니다!


3

오류 메시지 설명 :

클릭하려는 요소가 있지만 표시되지 않는다는 오류 메시지가 나타납니다. 무언가 보이지 않거나 일시적으로 보이지 않을 수 있습니다.

테스트 순간에 요소가 보이지 않는 데는 여러 가지 이유가있을 수 있습니다. 페이지를 다시 분석하고 사례에 적합한 솔루션을 찾으십시오.

특별한 경우에 대한 해결책 :

필자의 경우, 방금 클릭 한 화면 요소의 툴팁이 다음에 클릭하려는 요소 위에 팝업되었을 때이 오류가 발생합니다. Defocus 는 내가 필요한 솔루션이었습니다.

  • 초점을 맞추지 않는 빠른 솔루션 은 화면의 다른 부분에서 "아무것도"하지 않는 다른 요소를 클릭하는 것입니다. 클릭 동작 후에는 아무 일도 일어나지 않습니다.
  • 적절한 해결책element.blur()툴팁을 표시하는 요소 를 호출 하여 툴팁이 사라지는 것입니다.

3

이 오류의 원인은 클릭하려는 요소가 브라우저의 뷰포트 (사용자가 볼 수있는 영역)에 없기 때문입니다. 이를 극복하는 방법은 먼저 원하는 요소로 스크롤 한 다음 클릭을 수행하는 것입니다.

자바 스크립트 :

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)')
}

2

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에서는 아무런 해를 끼치 지 않았습니다. 이러한 브라우저에는 문제가 없지만 클릭하기 전에 요소의 위치로 스크롤하는 것은 여전히 ​​나쁜 일이 아닙니다.


2

어쩌면 실제로 깨끗한 솔루션은 아니지만 작동합니다.

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

2

호버를 테스트 한 후 툴팁 아래의 링크를 클릭해야했기 때문에이 버그가 발생했습니다. 해결책은 툴팁을 없애기 위해 page.find('.sp-logo').hover이전 에 추가하는 것이 었습니다 click_link.


2

재미 있고, 다양한 반응을 보며 시간을 보냈을 때, 아무도 분명하게 시도하지 않았으며, 물론 어느 쪽도 그렇지 않았습니다. 내 페이지와 같이 동일한 ID가 여러 번 사용 된 경우 ( "newButton") 원하는 것이 처음 발견 된 것이 아니라면이 오류가 발생할 가능성이 높습니다. 가장 쉬운 방법 (C #) :

var testIt = driver.FindElements(By.Id("newButton"));

FindElement가 아니라 FindElements입니다.

그런 다음 검색 결과에서 몇 개의 결과가 나왔는지 테스트하십시오. 두 번째 경우 다음을 사용할 수 있습니다.

testit[1].Click();

또는 누구든지 ID를 재사용하여 ID를 수정하십시오.


해당 ID별로 여러 개의 단추가 있고 한 번에 하나만 표시되기 때문에 LINQ를 사용하여 표시되는 첫 번째 요소 ( .First(x => x.Visible)FindElements 호출에 추가) 를 찾아 null이 아닌 경우 해당 요소를 클릭하는 것이 좋습니다.
Sean Duggan

2

언급 된 모든 제안을 테스트 한 후에도 아무런 효과가 없었습니다. 이 코드를 만들었습니다. 작동하지만 아름답지는 않습니다.

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();
            }
        }
    }
}

2

나는 일종의 무차별 클릭을하고 그것은 나를 위해 작동합니다.

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

2

jQuery페이지에로드 한 경우 다음 javascript 명령을 실행할 수 있습니다.

"$('#" + element_id + "').click()"

Python executor를 사용하는 예 :

driver.execute_script("$('#%s').click()" % element_id)

1

나는 같은 문제가 있었고 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>

문제를 일으킨 것에 놀라지 마십시오. 페이지에는 하나의 ID 만 있어야합니다. 해결 방법이 아닌 나쁜 디자인을 풀고있었습니다.
Dave Lawrence

1

셀레늄을 사용할 때 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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.