web-dev-qa-db-ja.com

Seleniumは他の要素によって隠されているため、要素をクリックできません

セットアップ

Python 3.xとSeleniumを使用してクエリフィールドに入力し、続いて検索ボタンをクリックします。

_# element containing the product search bar and buttons
search_area = el_id('Products').find_element_by_class_name('searchArea')

# insert name of file to be duplicated
name_field = search_area.find_element_by_xpath("//input[@type='text']")
name_field.clear()
name_field.send_keys('to_be_duplicated')  

# click search button
search_area.find_element_by_xpath('span/a[1]').click()
_

ここで、el_id(x) = browser.find_element_by_id(x)


問題

上記のコードを実行すると、次のエラーが発生します。

_ElementClickInterceptedException: Element <a class="button button-fleft searchButton" href="#"> is not clickable at point (577.6166763305664,225.06666564941406) because another element <div class="blockUI blockOverlay"> obscures it
_

このエラーを解決するには、つかむ前にハードウェイトを挿入してボタンをクリックします。

_# click search button
time.sleep(1)
search_area.find_element_by_xpath('span/a[1]').click()
_

しかし、私はむしろそれを異なって解決するので、私は この答え に従い、次のことを行いました、

_# click search button
search_button = search_area.find_element_by_xpath('span/a[1]')
WebDriverWait(driver, 10).until_not(EC.visibility_of_element_located((By.XPATH, 
"//*[@id="Products"]/tbody/tr[1]/td/div/input")))
search_button.click()
_

しかし、まったく同じエラーが発生しました。

私も この答え を試しましたが、同じエラーです。

これをどうやって解決しますか?

8
LucSpan

DebanjanBの答え のnr.5に従って、クリックしようとする前に一時的なオーバーレイが消えるのを待つようにコードを暗示して解決しました。

wait.until(EC.invisibility_of_element_located((By.XPATH,
              "//div[@class='blockUI blockOverlay']")))
el_xp("//input[@value='Save']").click()
4
LucSpan

これを行うにはいくつかの方法がありますが、そのうちの1つはJavascript executorによるものです。

あなたは言えた:

element = driver.find_element_by_xpath("//div[@class='blockUI blockOverlay']")

driver.execute_script("arguments[0].style.visibility='hidden'", element)

このようにして、class = 'blockUI blockOverlay'でdivをブロックでき、私が正しい場合は要素をクリックできます。

5
Anand