Błąd debugowania „Element nie jest klikalny w punkcie”

396

Widzę to tylko w Chrome.

Pełny komunikat o błędzie brzmi:

„org.openqa.selenium.WebDriverException: Elementu nie można kliknąć w punkcie (411, 675). Inny element otrzymałby kliknięcie: ...”

Element, który „otrzyma kliknięcie”, znajduje się z boku tego elementu, a nie nad nim i nie nakładając się na niego, nie poruszając się po stronie.

Próbowałem dodać przesunięcie, ale to też nie działa. Element znajduje się w wyświetlonym oknie bez potrzeby przewijania.

użytkownik1591169
źródło
2
Czy czekasz na załadowanie strony? Może inny element nakłada się na nią podczas ładowania strony?
Herokiller
55
Krótka historia dla nowo przybyłych - ELEMENT NIE JEST WIDOCZNY NA STRONIE I W związku z tym NIE JEST KLIKNIĘTY. POTRZEBUJESZ PRZEGLĄDAĆ VIEWPORT PRZEZ EMITOWANIE okna.
Chris B. Behrens
67
@ ChrisB.Behrens Nie zawsze tak jest. Ten konkretny błąd można również podać, gdy element jest objęty innym. Miałem ten wyjątek, gdy próbowałem kliknąć przycisk, który był kolejnym elementem z ustaloną pozycją.
Martin Cassidy
4
To nie tylko Chromedriver - miał ten sam problem z Firefoksem. Rozwiązałem problem, wprowadzając opóźnienie oczekiwania na pełne załadowanie strony, jak sugerują inni powyżej.
codervince
5
Myślę, że to absolutnie zła rada, aby emitować scrollTo lub czekać. Wygląda na to, że algorytm klikania selenu to: 1. oblicz pozycję elementu 2. przewiń do tej pozycji (więc nie musisz jej wydawać samodzielnie) 3. kliknij do tej pozycji (wyjątek pochodzi od ostatniego stwierdzenia, które sprawdza, który element stoi na tym pozycja tuż przed faktycznym wysłaniem zdarzenia kliknięcia). Moje porady: 1. sprawdź, czy element znajduje się w twoim obszarze wyświetlania. 2. sprawdź, czy element nie jest objęty jakimkolwiek innym (np. Lepkim menu), ukryj je, jeśli istnieje, lub przewiń ręcznie przed kliknięciem, nie polegając na wbudowanym scrollTo.
Vitalik Verhovodov

Odpowiedzi:

325

Jest to spowodowane 3 następującymi typami:

1. Element nie jest widoczny do kliknięcia.

Użyj akcji lub JavascriptExecutor do kliknięcia.

Według działań:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

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

lub

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Następnie kliknij element.

2. Strona jest odświeżana przed kliknięciem elementu.

W tym celu poczekaj kilka sekund na stronie.

3. Element można kliknąć, ale na nim znajduje się pokrętło / nakładka

Poniższy kod będzie czekał, aż nakładka zniknie

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Następnie kliknij element.

Prabu Ananthakrishnan
źródło
52
Istnieje trzeci rodzaj przyczyny, a mianowicie to, że twój element jest zawinięty w div lub rozpiętość. Stronę można w pełni załadować i całkowicie w okienku ekranu, ale Chromedriver odmówi jej kliknięcia, w przypadku gdy serwer WWW dla FF i IE nie ma problemu. Prawdziwy człowiek nie ma pojęcia, że ​​zakres istnieje, a przeglądarka nie dba o to, kiedy faktycznie go klikniesz, jako człowiek. Ani poruszanie się, ani czekanie nie rozwiąże tego problemu; albo unikaj Chrome / chromedriver, albo przepisz HTML strony wydaje się być jedyną opcją dla ludzi w przypadku 3.
Don Simon
54
@ DonSimon Miałem ten sam problem, co ty. Byłem w stanie obejść to za pomocą .SendKeys (Keys.Return) zamiast .Click. To działało dla mnie w Chrome, gdzie miałem ten problem, oraz w Firefoksie, gdzie miałem inny podobny problem z tym konkretnym linkiem (kotwica owinięta w Div).
Peter Bernier,
17
Rozwiązanie sugerowane przez @PeterBernier działa dobrze w przypadku, gdy element jest zawinięty w div lub rozpiętość. W Pythonie użyłem .send_keys ('\ n') do symulacji kliknięcia i obejścia problemu w Chrome.
GJ
4
Jeśli element jest ukryty przez element div, poniższy kod to naprawia. executeJavascript ("argumenty [0] .click ();", selenium.findElement (locator));
EsotericNonsense
Możesz także poczekać, aż element będzie klikalny. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus
67

Możesz także użyć JavaScript i przewijanie nie byłoby wtedy wymagane.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Bart Wojtala
źródło
5
Nie do wiary! Zastanawiam się, dlaczego selen nie niszczy udostępnianej przez siebie metody click (), biorąc pod uwagę, że istnieją warunki, w których isDisplayed () i isEnabled () nie wystarczą do kliknięcia elementu, i wydaje się, że jest to jedyne rozwiązanie. Dzięki!
Giovanni Bitliner,
2
+1: To rozwiązanie działało dla mnie. actions.MoveToElementnie działało dla mnie w języku C #, a inne rozwiązania przewijania wydawały się trochę kruche, ponieważ istniała szansa, że ​​przewijanie może nieprawidłowo wyświetlić element lub pozycja elementu na stronie może się zmienić.
Użytkownik
1
to rozwiązanie jest najłatwiejsze, jeśli element nie jest widoczny, ale istnieje na stronie
Yashveer Rana
@ Giovanni Bitliner Nie zapewniają tej metody, ponieważ nie jest to prawdziwy scenariusz dla użytkownika. Użytkownicy powinni również poczekać, aż moduł ładujący zniknie. Myślę, że to cudowna sprawa w selenie.
Gideon Mulder
+1 Pracowało również dla mnie. Właśnie dodałem do mojego kodu metodę flwg: `private void jsClick (element IWebElement, sterownik IWebDriver) {IJavaScriptExecutor ex = (IJavaScriptExecutor); ex.ExecuteScript („argumenty [0] .click ();”, element); } `wywołane w ten sposób: 'jsClick (driver.FindElement (By.XPath („ xpathOfTheElement ”))); `
Jeremias
46

Wygląda na to, że jest błąd w chromeedriver (problem polega na tym, że jest oznaczony jako nie można go naprawić) -> GitHub Link

( może wystawić nagrodę FreonsSponsors ?)

W komentarzu nr 27 zaproponowano obejście tego problemu. Może to zadziała dla ciebie

Tony Lâmpada
źródło
4
Wydaje się sprawiedliwe - jeśli przycisku nie ma na ekranie, to tak naprawdę nie można go kliknąć.
Evan Knowles
To nie jest błąd. Jest to zamierzone zachowanie i jest prawidłowe. Zgodnie z innymi sugestiami, jeśli element znajduje się poza oknem ekranu - musisz go przewinąć.
Alex Skrypnyk
Wypróbowałem Firefoksa i okazało się, że nie dał tego błędu, ale kliknięcie nadal było ignorowane. Okazało się, że div rodzica miał wysokość zero. Po rozwiązaniu problemu oba działały dobrze.
dansalmo
35

Miałem ten sam problem, wypróbowałem wszystkie oferowane rozwiązania, ale one nie działały dla mnie. ostatecznie użyłem tego:

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

Mam nadzieję że to pomoże

XGillerX
źródło
16

Widziałem to w sytuacji, gdy okno Chrome napędzane selenem było zbyt małe. Element, który ma zostać kliknięty, znalazł się poza oknem ekranu i dlatego nie działał.

To brzmi logicznie ... prawdziwy użytkownik musiałby albo zmienić rozmiar okna, albo przewinąć, aby można było zobaczyć element i faktycznie go kliknąć.

Po poleceniu sterownikowi selenu odpowiedniego ustawienia rozmiaru okna, te problemy zniknęły dla mnie. Interfejs API webdriver jest tutaj opisany .

opichals
źródło
15

Wow, wiele odpowiedzi tutaj i wiele dobrych.

Mam nadzieję, że dodam coś do tego z mojego doświadczenia.

No cóż, w moim przypadku nakładka na ciasteczko od czasu do czasu ukrywała element. Działa także przewijanie do elementu; ale moim skromnym zdaniem (w moim przypadku nie jest to panaceum dla wszystkich) najprostszym rozwiązaniem jest przejście na pełny ekran (uruchamiałem swoje skrypty na 3/4 okna ekranu)! Więc zaczynamy:

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

Mam nadzieję, że to pomaga!

Xwris Stoixeia
źródło
13

ruby / watir-webdriver / chrome

Używam następującej sztuczki i wygląda na to, że to działa:

#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")
Annet
źródło
1
Problem, który widziałem, dotyczył mapy obszaru. Błąd był taki sam jak oryginalny post tutaj - div „przed” obszarem, który musiałem kliknąć. To nie był problem z AJAX / czasem / ładowaniem strony, a obszar był w pełni widoczny - nie mogłem nawet przewijać, aby się na nim skupić. Jednak zmiana metody kliknięcia z object.click na object.fire_event („click”) wydaje się rozwiązać problem. Zostawiłem go w bloku początkowym / ratunkowym, aby nie miało to wpływu na normalne klikanie przeglądarki Firefox.
adam reed
To podejście pomogło mi rozwiązać problem, gdy w oknie roboczym były elementy niewidoczne.
Jason R. Coombs
13

Ja również zmagałem się z tym problemem. Kod działa poprawnie w FF, awaria w Chrome. Starałem się kliknąć pole wyboru - jeśli nie było widoczne, przewijałem, aby wyświetlić, a następnie klikałem. Nawet przewijanie do widoku działa w Chrome, tylko kilka dolnych pikseli pola wyboru nie było widoczne, więc webdriver odmówił kliknięcia.

Moje obejście jest następujące:

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 ma również problemy z sendKeys, czasem użycie Akcji jest czasem konieczne. Oczywiście musisz wiedzieć, w którym kierunku i ile musisz iść, aby Twój przebieg mógł się różnić. Ale wolę to od hakowania javascript, więc zamieszczam to tutaj, na wypadek, gdyby ktoś inny uznał to za przydatne.

kolibri
źródło
Lokalizowalny jest przestarzały.
Steve Staple,
12

Ten błąd pojawiał się podczas uruchamiania testów bez użycia głowy za pomocą xvfb-run. Pracowali bezbłędnie lokalnie. Używając chrome, wersje webdriver / chromedriver / chrome / java itp. Są identyczne.

Błąd „nie naprawi” w chromeedriver - GitHub Link wskazany przez Tony'ego Lâmpada sugeruje, że może to być związane z tym, co jest / nie jest widoczne na ekranie.

Komunikat pomocy dla xvfb-run pokazuje następujące informacje:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Zmiana rozdzielczości dla xvfb sprawiła, że ​​błąd zniknął:

xvfb-run -s "-screen 0 1280x1024x16" ...
u-phoria
źródło
9

Podczas używania Kątomierza pomogło mi to:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
Gal Bracha
źródło
8

Najpierw spróbuj pobrać najnowszy sterownik Chrome i sprawdź, czy to rozwiązuje problem.

W moim przypadku nie rozwiązało to problemu. Ale do tej pory działało dla mnie następujące rozwiązanie. Poniżej znajduje się kod C #, ale możesz postępować zgodnie z tą samą logiką w swoim języku. To, co tu robimy, to

Krok 1: Skoncentruj się na elemencie za pomocą obiektu Selenium Actions,

Krok 2: Następnie kliknij element

Krok 3: Jeśli istnieje wyjątek, wywołujemy zdarzenie „Kliknięcie” javascript na elemencie, wykonując skrypt javascript za pomocą metody „ExecuteScript” sterownika przeglądarki Selenium.

Możesz także pominąć krok 1 i 2 i spróbować tylko krok 3. Krok 3 działałby sam, ale zauważyłem dziwne zachowanie w jednym scenariuszu, w którym krok 3, mimo że z powodzeniem kliknął element, spowodował nieoczekiwane zachowanie w innych częściach mojego kodu po kliknięciu elementu.

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

            }
Sujewewa
źródło
Miałem ten sam problem. Twój pierwszy krok korzystania z klasy Działania działa świetnie. Nigdy bym o tym nie pomyślał. Dzięki!
Conner
Twój pierwszy krok to świetne rozwiązanie.
Sovandara LENG,
7

Zrobiłem tę metodę na podstawie komentarza z odpowiedzi Tony'ego Lâmpady. Pracuje bardzo dobrze.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
Roger Garza
źródło
6

Ten sam problem występował podczas uruchamiania skryptu selenu w Pythonie. Oto, co kliknąłem na element:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()
psr
źródło
5

Miałem do czynienia z podobnym problemem, gdzie muszę zaznaczyć dwa pola wyboru jeden po drugim, ale otrzymywałem ten sam powyższy błąd. Wtedy dodałem czekać między krokami na sprawdzenie pól wyboru ... działa dobrze i świetnie. oto kroki: -

  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
Milind
źródło
Dodam tylko, że nie jest to właściwy sposób korzystania ze składni korniszonu. Kroki powinny mieć postać „dane - kiedy - wtedy” i nie należy ich mieszać. Jeśli po „następnie” potrzeba więcej „kiedy”, prawdopodobnie potrzebny jest osobny przypadek testowy.
Floella,
5

Musisz użyć fokusa lub przewinąć ten element. Być może będziesz musiał użyć opcji Explict wait.

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

LUB

Elementu nie można kliknąć ze względu na Spinner / Overlay na nim:

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

LUB

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

LUB

Jeśli nadal nie działa, użyj JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
Shubham Jain
źródło
3

Najwyraźniej jest to wynik błędu „nie naprawi” w pliku binarnym sterownika Chrome.

Jedno rozwiązanie, które zadziałało dla mnie (Nasz przebieg może się różnić), można znaleźć w tej dyskusji w Grupie dyskusyjnej Google, Komentarz nr 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

Odpowiednia część znajduje się tutaj:

Od tego czasu pracowałem nad tym problemem, przechodząc bezpośrednio do href macierzystej kotwicy zakresu.

driver.Navigate (). GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)). FindElement (By.XPath („..”)). GetAttribute („href”));

W moim przypadku używam Pythona, więc kiedy już dostałem pożądany element, po prostu go użyłem

driver.get(ViewElm.get_attribute('href'))

Spodziewałbym się jednak, że zadziała to tylko, jeśli element, który próbujesz kliknąć, to link ...

alpheus
źródło
3

Miałem ten sam problem z clj-webdriver (port clojure Selenium). Właśnie dla wygody przetłumaczyłem poprzednie rozwiązanie na clojure. Możesz wywołać tę funkcję przed kliknięciem lub czymkolwiek innym, aby uniknąć tego problemu.

(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))))
Jaime Agudo
źródło
3

Może się tak zdarzyć, jeśli element zmieni pozycję, gdy sterownik próbuje go kliknąć (widziałem to również w IE). Kierowca zachowuje pozycję początkową, ale zanim faktycznie ją kliknie, pozycja ta nie wskazuje już tego elementu. Sterownik FireFox nie ma tego problemu BTW, najwyraźniej programowo „klika” elementy.

W każdym razie może się to zdarzyć, gdy używasz animacji lub po prostu dynamicznie zmieniasz wysokość elementów (np $("#foo").height(500).). Musisz upewnić się, że klikasz elementy dopiero po „ustaleniu” ich wysokości. Skończyło się na kodzie, który wygląda następująco (powiązania C #):

if (!(driver is FirefoxDriver))
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
        d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}

W przypadku animacji lub innego czynnika, o który nie można łatwo zapytać, można zastosować metodę „ogólną”, która czeka na zatrzymanie się elementu:

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;
});
Ohad Schneider
źródło
To wydaje się być tym, czego doświadczam. Sporadycznie dostaję wyjątek „Inny element by ...”, ale zrzuty ekranu pokazują, że modal jest na ekranie, a element nie jest objęty i używam czekania przed kliknięciem. Okazuje się, że po kliknięciu modalu, który otwiera, faktycznie przesuwa się po stronie. W zależności od tego, kiedy selen czeka na rzeczywiste próbki DOM, wyjątek może zostać zgłoszony, jeśli złapał modal podczas ruchu.
Levi Noecker,
3

Spotkałem się z tym, ponieważ okno dialogowe ładowania obejmuje ten element. Prosto rozwiązuję go, dodając oczekiwanie przed rozpoczęciem pracy z tym elementem.

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

Mam nadzieję, że to pomoże!

Huy Hóm Hỉnh
źródło
3

Objaśnienie komunikatu o błędzie :

Komunikat o błędzie mówi po prostu, że element, który chcesz kliknąć, jest obecny, ale nie jest widoczny. Może być przykryty lub tymczasowo niewidoczny.

Może być wiele powodów, dla których element nie jest widoczny w momencie testu. Ponownie przeanalizuj swoją stronę i znajdź odpowiednie rozwiązanie dla swojej sprawy.

Rozwiązanie dla konkretnego przypadku :

W moim przypadku ten błąd występuje, gdy podpowiedź elementu ekranu, który właśnie kliknąłem, wyskakiwała nad elementem, który chciałem kliknąć w następnej kolejności. Rozmycie było rozwiązaniem, którego potrzebowałem.

  • Szybkim rozwiązaniem, jak rozogniskować, byłoby kliknięcie na inny element w innej części ekranu, który nie odpowiada „nic”. nic się nie dzieje po akcji kliknięcia.
  • Właściwym rozwiązaniem byłoby wywołanie element.blur()elementu wyskakującego z podpowiedzi, co spowodowałoby zniknięcie podpowiedzi.
Dee
źródło
3

Przyczyną tego błędu jest to, że element, który próbujesz kliknąć, nie znajduje się w okienku ekranu (region widziany przez użytkownika) przeglądarki. Tak więc sposobem na pokonanie tego jest przewinięcie najpierw do żądanego elementu, a następnie kliknięcie.

JavaScript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

Jawa:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}
sri
źródło
2

Odpowiedź Tony'ego Lâmpady, komentarz nr 27 rzeczywiście rozwiązał dla mnie problem, tyle że podał kod Java i potrzebowałem Pythona. Oto funkcja Pythona, która przewija do pozycji elementu, a następnie klika ją.

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

To rozwiązało problem dla mnie w Chrome 34.0. Nie spowodował żadnych szkód w Firefox 28.0 i IE 11; te przeglądarki nie podlegają problemowi, ale przewijanie do pozycji elementu przed kliknięciem nadal nie jest złe.

Steve Saporta
źródło
2

Może nie jest to naprawdę czyste rozwiązanie, ale działa:

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
radeklos
źródło
2

Otrzymałem ten błąd, ponieważ przetestowałem najechanie kursorem, a następnie musiałem kliknąć link pod etykietką. Rozwiązaniem było dodanie page.find('.sp-logo').hoverwcześniej, click_linkaby usunąć opis z drogi.

Dan Kohn
źródło
2

To zabawne, przez cały czas, gdy szukałem różnych odpowiedzi, nikt nie próbował tego, co oczywiste, czego oczywiście nie miałem. Jeśli strona ma ten sam identyfikator użyty wiele razy, jak mój, („newButton”,), a ta, której szukasz, nie jest pierwszą znalezioną, najprawdopodobniej dostaniesz ten błąd. Najłatwiejszą rzeczą do zrobienia (C #):

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

Pamiętaj, że to FindElements, a nie FindElement.

Następnie sprawdź, ile wyników wróciło z pobierania. Jeśli jest to drugi, możesz użyć:

testit[1].Click();

Lub uzyskaj, kto używał identyfikatorów, aby je naprawić.

CargoMeister
źródło
Jeśli dzieje się tak, ponieważ istnieje wiele przycisków o tym samym identyfikatorze, a jednocześnie wyświetlany jest tylko jeden, lepsze rozwiązanie polega na użyciu LINQ do znalezienia pierwszego widocznego elementu ( .First(x => x.Visible)dołącz do wywołania FindElements) i kliknięciu go, jeśli nie jest pusty.
Sean Duggan
2

Po przetestowaniu wszystkich wymienionych sugestii nic nie działało. Zrobiłem ten kod. Działa, ale nie jest piękny

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();
            }
        }
    }
}
Bruno Lee
źródło
2

Robię coś w rodzaju brutalnej siły kliknięć i to działa dla mnie.

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
Super Mario
źródło
2

Jeśli jQueryzaładowałeś stronę, możesz wykonać następujące polecenie javascript:

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

Przykład użycia executora python:

driver.execute_script("$('#%s').click()" % element_id)
Zags
źródło
1

Miałem ten sam problem i był spowodowany konfliktem identyfikatorów między div a łączem wewnątrz div. Więc kierowca klikał div zamiast linku, który chciałem. Zmieniłem identyfikator div i działało to poprawnie.

Przed:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Po:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
Jordan Silva
źródło
Nie jestem zaskoczony, że spowodowałeś problemy. Na stronie powinien znajdować się tylko jeden identyfikator. To było odwijanie złego projektu, a nie obejście.
Dave Lawrence
1

W Drupal podczas korzystania z Selenium :

    // 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();
Alex Skrypnyk
źródło