web-dev-qa-db-ja.com

セレン:要素はクリックできません...他の要素はクリックを受け取ります

DjangoプロジェクトでSeleniumテストを実行すると、エラーが発生し始めました。

Selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a>

2つの理由があります。1つ目は、以前にテストに合格したことと、コードベースのその部分を編集していないことです。第二に、Selenium駆動のFirefoxウィンドウが表示され、ページを最大化すると、テストに合格します。しかし、Firefoxブラウザーを最大化せずにSeleniumテストを実行すると、失敗します。

派手なJavaScript(基本的なBootstrap 3テンプレート)は使用せず、単純な古いhtmlとcssを使用しています。Django 1.9 on = Python 3.4。pipを実行してSeleniumへのアップグレードを確認しましたが、最新です。

ここにPastebinリンクがあります 私のビューとテンプレートの出力のhtmlへ。

失敗したテストの1つは次のとおりです。

def test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter(self):
        # Create user
        self.user = User.objects.get(username=test_superuser_username)
        # Log the user in
        self.log_user_in(user_object=self.user, password=test_superuser_password)
        self.browser.implicitly_wait(10)
        # Pull up the main task manager page
        self.browser.get(str(self.live_server_url) + reverse('task_manager:index'))
        # Make sure we go to the task manager index
        task_index_url = str(self.live_server_url) + reverse('task_manager:index')
        self.browser.get(task_index_url)
        self.browser.implicitly_wait(4)
        self.assertTrue(str(task_index_url) == self.browser.current_url,
                        msg=('Assertion that current_url is %s failed. Current_url is %s' %
                             (str(reverse('task_manager:index')), self.browser.current_url)))
        # Click the 'add task' button on the sidebar
        add_task_taskbar_button = self.browser.find_element_by_name('add_task_sidebar_link')
        add_task_taskbar_button.click()

最後の行はエラーを生成します:

ERROR: test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter (tasks.tests.test_functional.SeleniumTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/mint/Python_Projects/[project_name]/tasks/tests/test_functional.py", line 94, in test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter
    add_task_taskbar_button.click()
  File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/Selenium/webdriver/remote/webelement.py", line 75, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/Selenium/webdriver/remote/webelement.py", line 469, in _execute
    return self._parent.execute(command, params)
  File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/Selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/Selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
Selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a>
15
jejy2343

あなたの答えはあなたの質問の中にあります。

  1. エラーは「add_task_sidebar_link」と言いますnot clickable at point - (61, 24.300003051757812)これは、別の要素が存在する場所です-Other element would receive the click: <a class="navbar-brand" href="#"></a>クリックが試行されています。ブラウザを最大化していないため、ポイント座標を正しく取得できません。
  2. 将来のテストが中断しないように、plsはその要素までスクロールします。この投稿を参照してください( Selenium pythonスクロールダウンできません )。アクションチェーンを確認してください( http://Selenium-python.readthedocs.org/api .html#module-Selenium.webdriver.common.action_chains
9
Makjb lh

パーティーに非常に遅れましたが、私にとっては非常にシンプルなソリューションがありました。 .click()を行う代わりに、単に

.send_keys(Selenium.webdriver.common.keys.Keys.SPACE)

要素を選択すると、スペースバーで選択を切り替えることができます。私のために働いた!

21
Major Major

同様の問題(同じエラー)に遭遇し、send_keysを使用して上記のMajor Majorのソリューションを試してみて、マウスクリックではなくクリックをシミュレートするためにスペースバーを送信しました。

Major Majorのソリューション:

.send_keys(Selenium.webdriver.common.keys.Keys.SPACE)

これを実行しようとして、「Selenium」を指す新しいエラーが発生しました。コードからそのキーワードを削除すると問題が修正され、要素をクリックすることができました。

使用された最後の成功したコードスニペット:

my_variable = driver.find_element_by_xpath('//*[@id="myId"]') #this is the checkbox
my_variable.send_keys(webdriver.common.keys.Keys.SPACE)
4
Will Rus

私は同じ問題を抱えていました:ポップアップウィンドウが原因で、クリックしなければならなかった要素が画面からずれてクリックできなくなります。

ページをスクロールして要素に到達しました。

Pythonの場合:

elem = driver.find_element_by_tag_name("html")
elem.send_keys(Keys.END)
1
rp2017

これは、互いに「カバーする」要素と関係があります。最大化されていないウィンドウで発生する場合、これは理にかなっています。ポップアップ/フローティングdiv、または実際にクリックしようとしている要素をカバーする別の要素がある場合にも発生する可能性があります。

Seleniumはユーザーを模倣しているため、通常はユーザーが実行できなかったアクションを実行することはできません(他の要素で覆われている要素をクリックするなど)。

これに対する潜在的な回避策は、Javascriptを使用して要素を見つけてクリックすることです。 ここの例

labels = driver.find_elements_by_tag_name("label")
inputs = driver.execute_script(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.Push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels)
0
aneroid

最近、Firefoxドライバーは、クリック位置の要素がクリックされるはずの要素であることを確認します。このエラーは、ドライバーが要素をクリックしようとしたときに、別の要素がその上にあることを意味します。残念ながら、ドライバーはコンテナーを自動的にスクロールせず、代わりにこのエラーを発生させます。

この問題を処理する方法は、画面の中央にある要素をスクロールして、もう一度クリックすることです。クリックメソッドのモンキーパッチ:

JS_SCROLL_ELEMENT_CENTER_WINDOW = """\
  var element = arguments[0];
  element.scrollIntoView(true);
  var y = (window.innerHeight - element.offsetHeight) / 2;
  if (y > 0) {
    for (var e=element; e; e=e.parentElement) {
      if (e.scrollTop) {
        var yy = Math.min(e.scrollTop, y);
        e.scrollTop -= yy;
        if ((y -= yy) < 1)
          return;
      }
    }
    window.scrollBy(0, -y);
  }
  """

def click(self):
  try:
    self._execute(Command.CLICK_ELEMENT)
  except:
    self._parent.execute(Command.EXECUTE_SCRIPT, \
      {'script': JS_SCROLL_ELEMENT_CENTER_WINDOW, 'args': [self]})
    self._execute(Command.CLICK_ELEMENT)

from Selenium.webdriver.remote.webelement import WebElement
from Selenium.webdriver.remote.command import Command
WebElement.click = click
0
Florent B.

私の現在のCapybaraプロジェクトでは、「Element not clickable」エラーが頻繁に発生します。この種のエラーの理由は、Webページが要素を見つけるのに十分にロードされないためです。以前にテストが合格し、コードベースのその部分を編集していないことを述べたように、次のことを実行してこれを通過させることができます。

  1. 「add_task_sidebar_link」を見つける前に、もう少し待機します。ページが完全にロードされるようにします。
  2. それでも、待機を追加した後でもテストが失敗する場合は、要素をクリックする前にスクリーンショットを撮るメソッドを追加します。これは、テストのデバッグに役立ちます。
0
Sarabjit Singh