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.


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.


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

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


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


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 .


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!


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

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.


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

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

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

            }

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

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

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

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

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


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

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

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!


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.

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

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.


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

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.


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


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

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

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)

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>

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.