0

Webアプリケーションでフォルダ構造を作成する作業を自動化するため、右クリックして新しいフォルダを追加できるコンテキストメニューを開く必要があります。Python-Seleniumは連続したループで右クリックを実行できません

folder_path = "Folder A\Folder B\Folder C" 
folder_path_list = folder_path.split('\\') 
for folder in folder_path_list: 
    try: 
     folder = WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 
           "div.tree-row.selected + div.tree-children > div > div > a[title='{}']".format(folder)))) 
     folder.click() 
     time.sleep(5) 
    except: 
     parent_folder = WebDriverWait(browser, 8).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.tree-row.selected > a > span.tree-label"))) 
     parent_folder.click() 
     actionchains.context_click(parent_folder).perform() 
     add_new_folder_icon = WebDriverWait(browser, 8).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "li.CMicon-add-location"))) 
     add_new_folder_icon.click() 
     del parent_folder 

このコードは、最初の反復中に正常に実行されるが、2回目の反復のための3行目に右クリックを実行するために失敗したループ内でフォルダごとに実行されます。 StaleElementReferenceExceptionエラーをスローします。私は、各ループの最後でparent_folder変数をクリアするには、ノー成功

  • 追加delコマンドでは、次の解決方法を試してみました。
  • ブラウザのページ全体を更新して、最後に作成したフォルダに再度移動しますが、同じ例外がスローされます。

私が混乱するのは、要素を見つけて左クリックして選択することができても、右クリックを実行するだけで問題に直面するということです。

+0

ブロック以外で試してみることはできますか? '真しばらく: \t試し: \t \t actionchains.context_click(parent_folder).perform() \t \tブレーク \t除く: \t \t印刷( "失敗")' – SAZ

+0

[OK]を私はそれを試してみましたが、それはまだ失敗しました。 – Chandral

+0

@Chandralループにフルコードを追加できますか? –

答えて

1

アクションチェーンはどこで初期化されていますか?例外ループで使用する前にアクションチェーンを再初期化してみてください

actionchains = ActionChains(browser) 
actionchains.context_click(parent_folder).perform() 
+0

ありがとう、それは動作します。なぜ各ループの変数を初期化する必要がありますか? – Chandral

+1

ActionChainsオブジェクトのアクションのメソッドを呼び出すと、アクションはActionChainsオブジェクトのキューに格納されます。 perform()を呼び出すと、イベントはキューに入れられた順に発生します。 StaleElementReferenceExceptionは、古い参照にアクセスしようとしていることを意味します。 – Amit

関連する問題