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 

此代码为运行在一个循环的第一次迭代期间,成功执行,但无法执行每个文件夹中的右键单击用于第二次迭代3线。它会抛出一个StaleElementReferenceException错误。我曾尝试没有成功

  • 添加了del命令如下解决方案在每个循环的结束清除parent_folder变量。
  • 刷新整个浏览器页面并重新导航到我创建的最后一个文件夹,但它会抛出相同的异常。

让我感到困惑的是,即使它能够找到该元素,然后左键单击并选中它,它也只会执行右键单击操作。

+0

你可以尝试在try块中使用它吗? '而真实: \t尝试: \t \t actionchains.context_click(parent_folder).perform() \t \t休息 \t情况除外: \t \t打印( “失败”)' – SAZ

+0

好吧,我试过了,它仍然失败。 – Chandral

+0

@Chandral你可以在循环中添加完整的代码吗? –

回答

1

动作链初始化在哪里?尝试重新初始化动作链,然后在除外循环中使用它

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

谢谢,这工作。为什么我必须在每个循环中初始化变量? – Chandral

+1

当您调用ActionChains对象的操作方法时,这些操作存储在ActionChains对象的队列中。当你调用perform()时,事件按照它们排队的顺序被触发。 StaleElementReferenceException意味着它试图访问一个旧的引用。 – Amit