web-dev-qa-db-ja.com

Python and Selenium To“ execute_script” to solution“ ElementNotVisibleException”

Seleniumを使用してWebページを保存しています。特定のチェックボックスがクリックされると、Webページのコンテンツが変更されます。チェックボックスをクリックして、ページのコンテンツを保存します。 (チェックボックスはJavaScriptによって制御されます。)

最初に使用したもの:

driver.find_element_by_name("keywords_here").click()

エラーで終了します:

NoSuchElementException

次に、暗黙的/明示的な待機を使用して、次のような「xpath」を試しました。

URL = “the url”

verificationErrors = []
accept_next_alert = True

aaa = driver.get(URL)
driver.maximize_window()
WebDriverWait(driver, 10)

#driver.find_element_by_xpath(".//*[contains(text(), ' keywords_here')]").click()
#Or: 

driver.find_element_by_xpath("//label[contains(text(),' keywords_here')]/../input[@type='checkbox']").click()

エラーが発生します:

ElementNotVisibleException

投稿

Selenium WebDriverに現在表示されていない要素をクリックさせる方法は?

セレン元素は表示されない例外

クリックする前にチェックボックスを表示するように提案します。たとえば、次のように使用します。

execute_script

質問はばかげているように聞こえるかもしれませんが、ページのソースコードからチェックボックスの可視性を「execute_script」するための適切な文を見つけるにはどうすればよいですか?

それ以外に、別の方法はありますか?

ありがとう。

ちなみに、行のhtmlコードは次のようになります。

<input type="checkbox" onclick="ComponentArt_HandleCheck(this,'p3',11);" name="keywords_here">

そのxpathは次のようになります。

//*[@id="TreeView1_item_11"]/tbody/tr/td[3]/input
5
Mark K

別のオプションは、click()execute_script()内に作成することです。

# wait for element to become present
wait = WebDriverWait(driver, 10)
checkbox = wait.until(EC.presence_of_element_located((By.NAME, "keywords_here")))

driver.execute_script("arguments[0].click();", checkbox)

ここで、ECは次のようにインポートされます。

from Selenium.webdriver.support import expected_conditions as EC

または、暗闇の中での別のショットとして、element_to_be_clickable期待される条件を使用して、通常の方法でクリックを実行できます。

wait = WebDriverWait(driver, 10)
checkbox = wait.until(EC.element_to_be_clickable((By.NAME, "keywords_here")))

checkbox.click()
6
alecxe

予想される条件にいくつか問題がありました。独自のタイムアウトを作成することを好みます。

import time
from Selenium import webdriver
from Selenium.common.exceptions import \
    NoSuchElementException, \
    WebDriverException
from Selenium.webdriver.common.by import By

b = webdriver.Firefox()
url = 'the url'
b.get(url)
locator_type = By.XPATH
locator = "//label[contains(text(),' keywords_here')]/../input[@type='checkbox']"
timeout = 10
success = False
wait_until = time.time() + timeout
while wait_until < time.time():
    try:
        element = b.find_element(locator_type, locator)
        assert element.is_displayed()
        assert element.is_enabled()
        element.click()
        success = True
        break
    except (NoSuchElementException, AssertionError, WebDriverException):
        pass
if not success:
    error_message = 'Failed to click the thing!'
    print(error_message)

invalidElementStateException、およびStaleElementReferenceExceptionを追加する場合があります

1
Roskoe