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


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.