Налагодження помилки "Елемент не можна натискати в точці"


396

Я бачу це лише в Chrome.

Повне повідомлення про помилку звучить:

"org.openqa.selenium.WebDriverException: Елемент не можна натискати в точці (411, 675). Інший елемент отримає клацання: ..."

Елемент, який "отримав би клацання", знаходиться збоку від відповідного елемента, а не зверху та не перекриває його, не переміщуючись по сторінці.

Я спробував додати зміщення, але це теж не працює. Елемент знаходиться у вікні, що відображається, без необхідності прокручування.


2
Ви чекаєте завантаження сторінки? Може, інший елемент перекриває його під час завантаження сторінки?
Герокілер

55
Довга коротка історія для тих, хто щойно приїжджає - ЕЛЕМЕНТ НЕ ВІДЗВИТАЄТЬСЯ НА СТОРІНІ, А ТОГО НЕ МОЖЕ КЛІЧНО. НЕОБХІДНО ПРОКЛЮЧАТИ ОГЛЯД ОГЛЯДУ ВІДВИЩЕННЯМ вікна.
Кріс Б. Беренс

67
@ ChrisB.Behrens Це не завжди так. Цю конкретну помилку можна також додати, коли елемент охоплюється іншим. У мене був цей виняток, коли я намагався натиснути кнопку, яка була ще одним елементом із фіксованим положенням.
Мартін Кассіді

4
Його не лише Chromedriver - мав таку ж проблему з Firefox. Я вирішив проблему, застосувавши затримку до очікування, поки сторінка повністю не перезавантажиться, як запропонували інші вище.
кодер переконати

5
Я вважаю, що це абсолютно неправильна порада випускати прокруткуTo або робити якісь очікування. Схоже, алгоритм клацання селеном такий: 1. обчисліть позицію елемента 2. прокрутіть до цієї позиції (тому не потрібно її самостійно видавати) 3. натисніть на цю позицію (виняток походить з останнього твердження, яке перевіряє, який елемент стоїть на цьому Позиція перед надсиланням події фактичного натискання) Мої поради: 1. Перевірте, чи елемент знаходиться у вашому вікні перегляду. 2. перевірте, чи елемент охоплюється будь-яким іншим (наприклад, липкими меню), прихойте їх, якщо вони є, або прокрутіть вручну перед клацанням, не покладаючись на вбудований scrollTo.
Віталік Верховодов

Відповіді:


325

Це викликано такими 3 типами:

1.Елемент не видно клацати.

Використовуйте дії або 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
Існує третій тип причини, який полягає в тому, що ваш елемент загорнутий у діву чи проліт. Сторінка може бути завантажена повністю і повністю у вікні перегляду, але Chromedriver відмовиться клацнути нею, де веб-драйвер для FF та IE не має жодних проблем. Справжня людина не має поняття, що проміжок існує, і браузер не хвилює, коли ви насправді натискаєте на нього, як людину. Ні переміщення, ні очікування не вирішать це питання; або уникайте Chrome / Chromeedriver, або переписуйте HTML-код сторінки, здається, єдиний варіант для людей у ​​випадку 3.
Дон Саймон,

54
@DonSimon У мене виникло те саме питання, що і у вас. Мені вдалося обійти його за допомогою .SendKeys (Keys.Return) замість .Click. Це працювало для мене в Chrome, де я мав цю проблему, і в Firefox, де у мене виникала ще одна аналогічна проблема на цьому конкретному посиланні (якір, загорнутий у Div).
Пітер Берньє

17
Рішення, запропоноване @PeterBernier, добре працює в тому випадку, коли елемент загорнутий у div або span. У Python я використовував .send_keys ('\ n') для імітації клацання та вирішення проблеми в Chrome.
GJ

4
Якщо елемент прихований елементом div, його виправляє наступний код. ExecuteJavascript ("аргументи [0] .click ();", selenium.findElement (локатор));
EsotericNonsense

Ви також можете зачекати, коли елемент може натискати. wait.Until (очікуваніConditions.ElementToBeClickable (webElement));
Кіль

67

Ви також можете використовувати JavaScript, і тоді прокрутка не буде потрібна.

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

5
Неймовірно! Цікаво, чому селен не втрачає метод click (), який вони надають, враховуючи, що існують умови, в яких isDisplayed () та isEnabled () недостатньо для клацання на елементі, і це здається єдиним рішенням. Дякую!
Джованні Бітлінер

2
+1: Це рішення, яке працювало на мене. actions.MoveToElementне працювало для мене в C #, а інші рішення прокрутки здавалися трохи крихкими, оскільки існує ймовірність, що прокрутка може неправильно отримати елемент перегляду або позиція елемента на сторінці може змінитися.
Користувач

1
це рішення є найпростішим, якщо елемент не переглядається, але він існує на сторінці
Yashveer Rana

@Giovanni Bitliner Цей метод не пропонується, оскільки це не справжній сценарій для користувачів. Користувачам також слід чекати, поки завантажувач зникне. Я думаю, що це дивовижна річ щодо селену.
Гедеон Малдер

+1 Також працював для мене. Щойно доданий метод flwg до мого коду: `приватний void jsClick (елемент IWebElement, драйвер IWebDriver) {IJavaScriptExecutor ex = (IJavaScriptExecutor) драйвер; ex.ExecuteScript ("аргументи [0] .click ();", елемент); } `викликається таким чином: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Єремія

46

Здається, для цього є помилка в Chromeedriver (проблема полягає в тому, що вона позначена як не виправлена) -> Посилання GitHub

( можливо, розмістіть виграш на FreedomSponsors ?)

У коментарі №27 запропоновано вирішення проблеми. Можливо, це спрацює для вас-


4
Здається справедливим - якщо кнопка відсутня на екрані, то її справді не можна натискати.
Еван Ноулз

Це не помилка. Це задумана поведінка і це правильно. Як і інші поради, якщо елемент знаходиться поза вікном перегляду - вам потрібно прокрутити його.
Олексій Скрипник

Я спробував Firefox і виявив, що це не дало цієї помилки, але натискання все ще було проігноровано. Виявилося, батьківський дів мав висоту нуля. Як тільки це було виправлено, обидва працювали нормально.
дансальмо

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

Я бачив це в ситуації, коли вікно Chrome із селеном було відкрито занадто мало. Елемент, на який слід натиснути, вийшов із вікна перегляду, тому він вийшов з ладу.

Це звучить логічно ... справжньому користувачеві доведеться або змінити розмір вікна, або прокрутити так, щоб можна було побачити елемент і насправді натиснути на нього.

Після вказівки драйвера селену належним чином встановити розмір вікна для мене ця проблема усунулася. WebDriver API є виконати описане тут .


15

Ого, тут багато відповідей і багато хороших.

Я сподіваюся, що я щось додам до цього зі свого досвіду.

Добре, хлопці, у моєму випадку час від часу певний елемент ховав елемент. Прокрутка до елемента також працює; але на мою скромну думку (на мій випадок, це не панацея від усіх), найпростішим рішенням є просто перейти на весь екран (я запускав свої сценарії на 3/4 вікна екрану)! Отже, ми йдемо:

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

Сподіваюся, що це допомагає!


13

рубін / watir-webdriver / хром

Я використовую такий фокус і, здається, він працює:

#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
Я бачив проблему з картою району. Помилка була такою ж, як і оригінальна публікація тут - діва "перед" області, яку мені потрібно було натиснути. Це не було проблемою завантаження AJAX / хронометражу / сторінки, і ця область була в повному обсязі - я не міг навіть прокрутити, щоб зосередитись на цьому. Однак, змінивши метод мого клацання з object.click на object.fire_event ("клік"), здається, вирішив проблему для мене. Я залишив його в блоці початку / порятунку, щоб він не вплинув на нормальне натискання Firefox.
adam reed

Такий підхід вирішив проблему для мене, коли у вікні перегляду були елементи, не помітні.
Джейсон Р. Кумбс

13

Я теж боровся з цією проблемою. Код відмінно працює у FF, не працює в 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, іноді необхідні дії. Очевидно, вам потрібно знати, в якому напрямку і скільки потрібно пройти, щоб ваш пробіг мінявся. Але я віддаю перевагу цьому хак-коду javascript, тому я розміщую його тут на випадок, якщо хтось знайде це корисним.


Місце розташування застаріле.
Стів Стейпл

12

Я отримував цю помилку під час запуску тестів без голови з xvfb-run. Вони працювали бездоганно на місцях. Використовуючи хром, версії webdriver / chromedriver / chrome / java тощо всі однакові.

Помилка "не виправить" у хромедрівері - GitHub Link, на яку вказував Тоні Лампада, припускає, що це може бути пов'язано з тим, що є / не видно на екрані.

Довідкове повідомлення для запуску xvfb показує таке:

-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

Під час використання Protractor це допомогло мені:

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: Якщо є виняток, ми запускаємо на елемент події "Click" на елементі, виконуючи сценарій javascript через метод "ExecuteScript" драйвера браузера Selenium.

Ви також можете пропустити крок 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();");

            }

У мене виникло те саме питання. Ваш крок 1 використання класу Дії чудово працює. Я б ніколи про це не думав. Дякую!
Коннер

Ваш перший крок - чудове рішення.
Sovandara LENG

7

Я зробив цей метод, грунтуючись на коментарі з відповіді Тоні Лампади. Це працює дуже добре.

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

6

У мене виникла та сама проблема під час запуску скрипта селену в python. Ось що я використовував для натискання на елемент:

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. Кроки мають бути у формі "дано - коли - тоді", і їх не слід змішувати. Якщо після "тоді" потрібно більше "пшениць", ймовірно, потрібен окремий тестовий випадок.
Флоелла

5

Потрібно використовувати фокус або прокручувати цей елемент. Можливо, вам також доведеться використовувати explict wait.

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

АБО

Елемент не можна натискати через Spinner / Overlay на ньому:

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

Мабуть, це результат помилки "Won't Fix" у двійковому драйвері Chrome.

Одне рішення, яке працювало для мене (Наш пробіг може змінюватися), можна знайти в цій дискусії Групи 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 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;
});

Це, мабуть, те, що я переживаю. Я з перервами отримую виняток ОП "Інший елемент буде ...", але на знімках екрана показано, що модаль знаходиться на екрані, а елемент не охоплюється, і я використовую очікування перед натисканням кнопки. Виявляється, коли модальний клавішу, на яку я натискаю, відкривається, вона насправді ковзає по сторінці. Залежно від того, коли селен чекає фактичних зразків DOM, виняток може бути кинуто, якщо він вловив модальний під час руху.
Леві Ноекер

3

Я зустрів це з тим, що обкладинка діалогу для завантаження цього елемента. Я просто вирішую це, додавши очікування перед роботою з цим елементом.

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

Сподіваюся, що це допоможе!


3

Пояснення повідомлення про помилку :

Повідомлення про помилку просто говорить, що елемент, на який потрібно натиснути, присутній, але його не видно. Це може бути прикрите чимось або тимчасовим не видно.

Причин, чому елемент не видно в момент тесту, може бути багато. Будь ласка, повторно проаналізуйте свою сторінку та знайдіть належне рішення для вашої справи.

Рішення для конкретного випадку :

У моєму випадку ця помилка виникає, коли підказка екранного елемента, на який я просто натиснув, перекочувала елемент, на який я хотів натиснути наступний. Дефокус був потрібним мені рішенням.

  • Швидким рішенням, як розфокусуватися, було б натискання на якийсь інший елемент в іншій частині екрана, який не робить нічого. нічого не відбувається після дії кліку.
  • Правильним рішенням було б закликати element.blur()елемент, який з'являється підказкою, що призведе до відмови підказки.

3

Причиною цієї помилки є те, що елемент, який ви намагаєтесь натиснути, не знаходиться у вікні перегляду (області, яку бачить користувач) браузера. Тож спосіб подолати це - прокрутіть спочатку потрібний елемент, а потім виконавши клацання.

Javascript:

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

Java:

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

Це смішно, весь час, який я проводив, переглядаючи різні відповіді, ніхто не пробував очевидного, що, звичайно, я теж не мав. Якщо на вашій сторінці є той самий ідентифікатор, який використовується декілька разів, як у мого, ("newButton",), а той, який ви хочете, не перший, знайдений, ви, швидше за все, отримаєте цю помилку. Найпростіше зробити (C #):

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

Зверніть увагу, що це FindElements, а не FindElement.

А потім перевірити, скільки результатів повернулося після отримання. Якщо це другий, ви можете використовувати:

testit[1].Click();

Або отримати кому-небудь повторно використані ідентифікатори, щоб виправити їх.


Якщо це відбувається через те, що за цим ідентифікатором є кілька кнопок, і одночасно відображається лише одна, покращене рішення передбачає використання LINQ для пошуку першого видимого елемента (додайте .First(x => x.Visible)до виклику FindElements) і натисніть на нього, якщо він не є нульовим.
Шон Дагган

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:

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

1

У мене була така ж проблема, і це було викликано конфліктом ідентифікатора між div та ланкою всередині div. Тож драйвер натискав на div, а не на посилання, яке я хотів. Я змінив ідентифікатор div, і він справно працював.

Перед:

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

Після:

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

Не здивований, що викликав у вас проблеми. На сторінці має бути лише один ідентифікатор. Це було розмотуванням поганого дизайну, а не обходу.
Дейв Лоуренс

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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.