bugfix> python > 投稿

Seleniumを使用して、Webサイト(Reactプロダクションビルドで実行)の特定の要素の内部テキストを取得しようとしています。私は次のことをしています:

driver = webdriver.Firefox()
driver.get('some site using React')
WebDriverWait(driver, 10).until(
    expected_conditions.text_to_be_present_in_element(
        (By.CSS_SELECTOR, '.parent p'), 
        'some text here'
    )
)

これはすべて機能します-実際、後で要素にアクセスすることもできます:

elem = driver.find_element(By.CSS_SELECTOR, '.parent p')
print(elem)
# -> <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="57b82b73-0c6a-40c5-97e1-b5861b3d43e6", element="736edc49-cef0-4723-b69e-afabd80f1e9d")>

ただし、これで何かをしようとするとすぐに、StaleElementReferenceExceptionが発生します。例えば、

print(elem.get_attribute('innerText'))

または

print(elem.text)

どちらも次のエラーをスローします。

selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <p> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

私も交換してみました expected_conditions.text_to_be_present_in_elementexpected_conditions.presence_of_element_located 、しかし問題はまだ解決しません。要素の読み込みを正常に待つことができ、その要素のテキストが私の形式と一致していることを認識している(つまり、何らかの方法でテキストを読み取ることができる)こと、さらには要素自体を印刷できることさえ、なぜ私は途方に暮れています-しかし、テキストを取得しようとすると(メソッドを呼び出さずに)プロパティを読み取ろうとすると、この例外が発生します。場合によっては、おそらく3回ごとに動作しますが、その後は再び動作しなくなります。

意図した形式に一致するとすぐにテキストにアクセスするために、このエラーを回避するにはどうすればよいですか(つまり、「ここにいくつかのテキスト」が含まれています)?


@PDHideのリクエストに従って、ここに私の完全なコードがあります:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Firefox()
while True:  # Running repeatedly, to ensure that the solution works consistently over multiple executions
    driver.get('url')
    WebDriverWait(driver, 10).until(
        EC.text_to_be_present_in_element(
            (By.CSS_SELECTOR, '.parent p'), 
            'some text here'
        )
    )
    print(driver.find_element(By.CSS_SELECTOR, '.parent p').get_attribute('innerText'))

これは通常、1回または2回の実行で機能します。その後、中断してスローに戻ります。 StaleElementReferenceException

回答 1 件
  • 古い要素は、要素が見つかった後にDOM(ページHTML)が変更されたことを示します。

    たとえば:

    print(elem.get_attribute('innerText'))
     clicksomebutton.click()
     print(elem.get_attribute('innerText'))
    
    

    クリックが更新されるか、画面に何かが読み込まれると失敗します。これが機能するためには、要素をもう一度見つける必要があります。

    print(elem.get_attribute('innerText'))
     clicksomebutton.click()
     print(driver.find_element_by_xpath('blabla').get_attribute('innerText'))
    
    
    
    
    

あなたの答え