0

Selenium を使用してページ内のリンクをループするコード スニペットがあります。高速化を試みるために (50 ページを実行しているため)に置き換えTime.sleep(3)ましたが、WebDriverWait()動作させることができません。何らかの理由implicitly_wait(30)で、トリックを行いません。

ドライバーが xpath で要素を見つけることができないため、変数「elems」を宣言しようとすると、コードが古い要素参照エラーを生成しますTime.sleep()WebDriverWait()

ここで使用した WebDriverWait() はその問題を解決しますが、コードは別の問題に遭遇します。ネストされた for ループの最後の行で、別の古い要素参照エラーがスローされます。WebDriverWait() がコードを進行させるときに要素が読み込まれますが、これらの要素の属性は必ずしも準備ができているとは限りません。

私の目的はコードをできるだけ速くすることなので、 Time.sleep(10) などはあまり魅力的ではありません。続行する前に、すべての要素とその属性がロードされていることをスムーズに確認するにはどうすればよいですか? そして、implicitly_wait(30) がこの問題を解決しないのはなぜでしょうか?

編集: 問題の URL: http://www.oddsportal.com/baseball/usa/mlb-2017/results/#/page/1/からhttp://www.oddsportal.com/baseball/usa/mlbへ-2017/結果/#/page/50/

PageRange = range(1, 50)
for page in PageRange:
    URL = "http://www.oddsportal.com/baseball/usa/mlb-" + season + "/results/#/page/" + str(page) + "/"
    driver.get(URL)
    tryElement = EC.presence_of_element_located((By.XPATH, "//a[@href]"))
    WebDriverWait(driver, 30).until(tryElement)
    elems = driver.find_elements_by_xpath("//a[@href]")
    for elem in elems:
        #This line I can't get not to throw a stale element reference 
        link = elem.get_attribute("href") 
4

1 に答える 1

0

提供した参照コード ブロックに従って、次のコード ブロックを使用して回避できますStaleElementReferenceException

PageRange = range(1, 50)
for page in PageRange:
    URL = "http://www.oddsportal.com/baseball/usa/mlb-" + season + "/results/#/page/" + str(page) + "/"
    driver.get(URL)
    elems = WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@href]")))
    for elem in elems:
        print(elem.get_attribute("href"))
于 2018-02-12T13:38:59.407 に答える