Python, Selenium: не удалось найти четвертый вложенный фрейм - PullRequest
0 голосов
/ 02 июля 2018

Я использую Selenium в Python для автоматизации некоторых задач на веб-странице. На веб-странице есть несколько вложенных iFrames, и мне нужно углубиться в четвертый вложенный iFrame, чтобы нажать на кнопку. первые три вложенных iFrame могут быть быстро переключены на, но когда дело доходит до четвертого iFrame, я всегда получаю ошибку тайм-аута, даже если я установил время ожидания до 120 с. Ниже приведен код Python и HTML. iframe name = "portalDisplay"> - это третий вложенный iframe, а iframe name = "ECMCOs" - это тот, на который я хочу переключиться и нажмите кнопку внутри него. Спасибо!

browser.switch_to_default_content()
WebDriverWait(browser, 60).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[@id="content"]'))) 
WebDriverWait(browser, 60).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//div[@id="unique1"]/iframe[1]')))
WebDriverWait(browser, 60).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//div[@id="divPageBody"]/iframe[1]')))
WebDriverWait(browser, 120).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'.//iframe[@name="ECMCOs"]')))

<iframe name="portalDisplay" src="emxPortalDisplay.jsp?portal=ECMEnterpriseChangeMgtPortal&amp;header=EnterpriseChangeMgt.Label.ECMChangeCOsCAsLeagcySummaryPageHeading&amp;emxSuiteDirectory=enterprisechangemgt&amp;treeLabel=91852699+001&amp;suiteKey=EnterpriseChangeMgt&amp;StringResourceFileId=emxEnterpriseChangeMgtStringResource&amp;SuiteDirectory=enterprisechangemgt&amp;objectId=20336.41905.42762.46685" width="100%" height="100%" frameborder="0" border="0" cd_frame_id_="ca6315bf2f2783f6030dd845f480d61d">
#document
<html>
<head>..<head>
<body>
<!-- //XSSOK -->
<script language="javascript" src="/enovia/common/scripts/emxUICore.js"></script>
<!-- //XSSOK -->
<script language="javascript" src="/enovia/common/scripts/emxUIModal.js"></script>
<script language="Javascript"> 
</script>
<script language="JavaScript">   var DisplayErrorMsg = "";
 </script>

<div class="pv-container" id="divPowerView" data-portalname="ECMEnterpriseChangeMgtPortal" style="overflow-y: hidden;">
  <div class="pv-row" id="divPvRow-1" minsize="240" style="height: 709px;">
    <div class="pv-channel complex" id="divPvChannel-1-1" style="width: 100%; 
     float: right; height: 100%;">
       <div class="pv-channel-tabs" id="pvChannelTabs">
         <table cellpadding="0" cellspacing="0" border="0"> 
          ....
          </div>
        <div class="pv-channel-content" style="">
           <div class="tab-header" style="display: none;"></div>
           <iframe name="ECMCOs" src="../common/emxIndentedTable.jsp? 
 sortColumnName=Name&amp;PrinterFriendly=true&amp;SuiteDirectory=enterprisechangemgt&amp;treeLabel=91852699+001&amp;parentOID=20336.41905.42762.46685&amp;emxSuiteDirectory=enterprisechangemgt&amp;HelpMarker=emxhelpchangeordersection&amp;program=enoECMChangeUtil%3AgetConnectedChanges&amp;functionality=isChangeOrderTab&amp;portalMode=true&amp;StringResourceFileId=emxEnterpriseChangeMgtStringResource&amp;toolbar=ECMChangeOrderManagementToolbar&amp;sortDirection=ascending&amp;selection=multiple&amp;portalCmdName=ECMCOs&amp;jsTreeID=null&amp;suiteKey=EnterpriseChangeMgt&amp;header=EnterpriseChangeMgt.Label.ECMChangeCOsCAsLeagcySummaryPageHeading&amp;portal=ECMEnterpriseChangeMgtPortal&amp;table=ECMChangeSummary&amp;objectId=20336.41905.42762.46685" frameborder="0" width="100%"></iframe></div>
<div class="pv-channel-content" style="display: none;">
<div class="tab-header" style="display: none;"></div><iframe name="ECMCRs" src="" frameborder="0" width="100%"></iframe></div><div class="pv-channel-content" style="display: none;"><div class="tab-header" style="display: none;"></div><iframe name="ECMChangeLegacy" src="" frameborder="0" width="100%"></iframe></div></div></div></div></body></html>

Фрагмент TML enter code here:

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Мне, наконец, удается подогнать его, используя следующий код:

browser.switch_to_default_content()
iframe1 = WebDriverWait(browser, 
120).until(EC.presence_of_element_located((By.XPATH,'//iframe[@id="content"]')))
browser.switch_to.frame(iframe1.get_attribute('id'))
iframe2 = WebDriverWait(browser,120).until 
(EC.presence_of_element_located((By.XPATH,'//div[@id="unique1"]/iframe[1]')))
browser.switch_to.frame(iframe2.get_attribute('name'))
iframe3 = WebDriverWait(browser,120).until 
(EC.presence_of_element_located((By.XPATH,'//div[@id="divPageBody"]/iframe[1]')))
browser.switch_to.frame(iframe3.get_attribute('name'))
time.sleep(20)
iframe4 = WebDriverWait(browser, 120).until 
(EC.presence_of_element_located((By.XPATH,'//iframe[@name="ECMCOs"]')))
browser.switch_to.frame(iframe4.get_attribute('name'))
  1. используйте имя кадра для переключения (согласно совету здесь )
  2. хитроумно использовать time.sleep () вместо browser.implicitly_wait (). Я пробовал browser.implicitly_wait () ранее, но даже я установил browser.implicitly_wait (70), все еще не работал, и я попытался распечатать первый iframe из текущей заметки (.// iframe [0]) Я получил iframe @ id = "content", похоже, что я не переключил кадр. Я предполагаю, что использование неявного ожидания WebDriver как бы выходит из iframe, когда он опрашивает DOM, пытаясь найти элемент. При использовании сна WebDriver останется в фрейме
0 голосов
/ 02 июля 2018

Я думаю, вы были довольно близки. Измените стратегию Locator с:

(By.XPATH,'.//iframe[@name="ECMCOs"]')
       ^ remove the dot

Кому:

(By.XPATH,"//iframe[@name='ECMCOs'][contains(@src,'/common/emxIndentedTable.jsp')]")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...