使用 Selenium 从另一个框架中查找与下拉列表相关的元素 -- Python

Using Selenium to find elements related to drop down list from another frame -- Python

我一直在尝试编写一个程序来自动化我的工作。 我的任务有一系列步骤,但我卡在了一点。我不断收到 NoSuchElementException。 我尝试使用 id、class、Selenium 的名称方法,但似乎没有任何效果。我现在的代码是这样的:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome('C:\Users\abc\AppData\Local\Programs\Python\Python36\chromedriver.exe')
browser.get("http://example.com/login.aspx")

usernameElem = browser.find_element_by_id('txtuser')
usernameElem.send_keys('admin')

passwordElem = browser.find_element_by_id('txtpassword')
passwordElem.send_keys('password')

loginElem = browser.find_element_by_id('btn_login')
loginElem.click() # follows the "Read It Online" link

browser.get("http://example.com/Reports.aspx")

subscriberslistElem = browser.find_element_by_id('ContentPlaceHolder1_rptDC_lnk_0')
subscriberslistElem.click()

browser.implicitly_wait(3)
entityElem = browser.find_element_by_id("report_Entity_ClientState")
print("Test")
entityElem.send_keys('Entity1')

browser.implicitly_wait(3)
reportElem = browser.find_element_by_class_name('selectbox')
print("Test 2")
reportElem.click()

showdataElem = browser.find_element_by_id('btn_new')
showdataElem.click()

excelElem = browser.find_element_by_id('imgExport')
excelElem.click()
print('All is well')

Link to webpage, complete files.

奇怪的是,当我以代码形式在线打开HTML文件并搜索'report_Entity_ClientState'时,没有任何结果。 我尝试访问的元素图像:

First element.

Second element.

找不到实体和报表元素。以下部分代码 return 错误。

entityElem = browser.find_element_by_id("report_Entity_ClientState")
reportElem = browser.find_element_by_class_name('selectbox')
entityElem.send_keys('Entity1')
browser.implicitly_wait(3)

HTML元素代码:

<html xmlns="http://www.w3.org/1999/xhtml"><head><title>

</title>
    <style type="text/css">
        .rgDataDiv
        {
            height: 350px !important;
        }
        #report2_demo1_dateInput, #report2_demo2_dateInput
        {
            background: none repeat scroll 0 0 #f0f3f4;
            border: 1px solid #4D87A5;
            border-radius: 0.3em;
            color: #296872;
            font-family: "HelveticaNeue-Light" , "Helvetica Neue Light" , "Helvetica Neue" ,Helvetica,Arial, "Lucida Grande" ,sans-serif;
            font-size: 14px;
            font-weight: 400;
            height: 1.8em;
            padding: 0 0.3em;
            position: relative;
            text-align: center;
            text-shadow: 1px 1px 0 #FFFFFF;
        }
        .selectbox
        {
            width: 175px;
            height: 27px;
            background-color: #FFF;
            border: 1px solid #b7b7b7;
            font: 400 12px/18px 'Open Sans' , sans-serif;
            color: #777;
            font-weight: bold;
            border: 1px solid #ccc;
            margin: 0em 0.5em;
            padding: 0em 0.5em;
            box-shadow: 0 0 1px rgba(0, 0, 0, 0.2);
        }
        .selectbox:hover
        {
            border: 1px solid #1261ac !important;
        }
        .selectbox option
        {
            padding: 5px;
        }
        .button
        {
            background-color: #23ad44;
            background-image: linear-gradient(to bottom, #23ad44, #23ad44);
            border: 1px solid #23ad44;
            border-radius: 3px;
            color: #ffffff;
            display: inline-block;
            font-family: arial,helvetica,sans-serif;
            font-size: 12px;
            font-weight: bold;
            margin-left: 5px;
            padding: 7px;
            text-align: center;
            text-decoration: none;
            width: 7em;
        }
        .button:hover
        {
            background-color: #23ad44;
            background-image: linear-gradient(to bottom, #23ad44, #23ad44);
            border: 1px solid #23ad44;
        }
    </style>

    <style type="text/css">
      #overlay
        {
            background-color: #000000;
            height: 100%;
            left: 0;
            opacity: 0.6;
            position: fixed;
            top: 0;
            width: 100%;
            z-index: 1500;
        }
        #theprogress
        {
            background-color: #000000;
            border: 0 solid #CCCCCC;
            height: 30px;
            line-height: 30px;
            opacity: 0.6;
            padding: 10px;
            text-align: center;
            width: 300px;
        }
        #modalprogress
        {
            position: absolute;
            top: 45%;
            left: 50%;
            margin: -11px 0 0 -150px;
            color: #990000;
            font-weight: bold;
            font-size: 14px;
        }
        .RepeaterLabel
        {
            color: #2980b9;
        }
    </style>
<link href="/WebResource.axd?d=YhrvG3mKYx0qi8zmG_e2lyIXyb_ANuRBo_sKLQFJLSvTN5PZ_1mAdbAu2oYdNj8IQ2baXlFznJaZLu1FNyX1Sw2&amp;t=634968929080000000" type="text/css" rel="stylesheet" class="Telerik_stylesheet"><link href="/WebResource.axd?d=pgzM84zOvBy03oK1BX9qj4AemgkqjvEpKd1DaZn3BmX7HYCaCPA9mDXES3WITAYhGWLhU3BijsiI-NqfoTxwKTiVY41t_WUGeTj39PR75xY1&amp;t=634968929080000000" type="text/css" rel="stylesheet" class="Telerik_stylesheet"></head>
<body>
    <form method="post" action="Rep1_SubList.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="">
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="">
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTIwNjA3NzE2NzEPZBYCAgMPZBYCAgEPZBYCZg9kFggCBQ8UKwACDxYEHgtfIURhdGFCb3VuZGceF0VuYWJsZUFqYXhTa2luUmVuZGVyaW5naGQPFCsAAhQrAAIPFgIeBFRleHQFA0FMTGRkFCsAAg8WBB8CBQhTUENHMDAzMx4FVmFsdWUFCFNQQ0cwMDMzZGQPFCsBAmZmFgEFd1RlbGVyaWsuV2ViLlVJLlJhZENvbWJvQm94SXRlbSwgVGVsZXJpay5XZWIuVUksIFZlcnNpb249MjAxMy4xLjIyMC40MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xMjFmYWU3ODE2NWJhM2Q0FghmDw8WBB4IQ3NzQ2xhc3MFCXJjYkhlYWRlch4EXyFTQgICZGQCAQ8PFgQfBAUJcmNiRm9vdGVyHwUCAmRkAgIPDxYCHwIFA0FMTGRkAgMPDxYEHwIFCFNQQ0cwMDMzHwMFCFNQQ0cwMDMzZGQCCQ8QZGQWAWZkAgsPEGRkFgFmZAIVDzwrAA4CABQrAAJkFwEFCFBhZ2VTaXplAhQBFgIWC2RkZRQrAAALKXlUZWxlcmlrLldlYi5VSS5HcmlkQ2hpbGRMb2FkTW9kZSwgVGVsZXJpay5XZWIuVUksIFZlcnNpb249MjAxMy4xLjIyMC40MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xMjFmYWU3ODE2NWJhM2Q0ATwrAAcACyl0VGVsZXJpay5XZWIuVUkuR3JpZEVkaXRNb2RlLCBUZWxlcmlrLldlYi5VSSwgVmVyc2lvbj0yMDEzLjEuMjIwLjQwLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTEyMWZhZTc4MTY1YmEzZDQBZGRkZGYWAmYPFCsAAhQrAAIUKwACZGRkZGQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDXJlcG9ydF9FbnRpdHkFDXJlcG9ydF9FbnRpdHkPFCsAAmVlZLr0AotH53uxPGSh7QymTeWwsdUnInQbJfo/1AqZAer9">
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>


<script src="/WebResource.axd?d=WPqzNIAf0aRvfZ51T5FqAw2&amp;t=636265663681012204" type="text/javascript"></script>


<script src="/ScriptResource.axd?d=0-K2f-KkPKroL1v8HQRfqOW6Bm5xtYnbtzo_BRMK3-orTVPkM3P6U7R-O_kYNMldQbgeLIbAfjb5i99L3QDP87wvzxMxirCvs4zeaZ5iCvg1&amp;t=16ab2387" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.');
//]]>
</script>

<script src="/ScriptResource.axd?d=0-K2f-KkPKroL1v8HQRfqOW6Bm5xtYnbtzo_BRMK3-orTVPkM3P6U7R-O_kYNMldkzOjZKCZKI8dbMwhU6puwXriFBMbrnAMLgehz7nDFguuKxruf9QzOB5sQpy88shJ0&amp;t=16ab2387" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCdnEq-SEy_US1KuLZmEnoxm0&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCcCRUgx0Nxj77KymelI6SbiewHQsPnET8txjQRIhxv9ow2&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCf49iuFjicOUhj3AUMkpbwDvPtFtRMJzCdeNbcfmY9RdA2&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCcStsFzhAvG6xzv928b3E8L1Pt9Gjfq_pIz-VgKJtG5wQ2&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCdT9MJqqpr-t50oq7GfpGoHVIJkcb_99EGhaoMesY6BL_Y4gIEI-tQ29AH-8m3OqeM1&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCdT9MJqqpr-t50oq7GfpGoHGGMRnTUBSrYO6OmjVxnhB1zYMtRDZSpvvOn8lbJO5tQ1&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=uLRCwOuJA-xwtRRow_E7Hq0v5K1DXj8YRZ2chYicyCfUqwvvfXR2C1xI7mel65lGuhK3m71Yx952aE6WQ4vkzg2&amp;t=ffffffffcf4a174e" type="text/javascript"></script>
<div class="aspNetHidden">

 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBgL/046PAQLBv5udDwLBv5udDwLO0LHzAwLP0LHzAwL9nO2QARGzTJ5Kcho1tzVM3gIXWgrV275r13MCRT/Kb4EgrVKR">
</div>
    <div id="pnlMain">
 
         <div id="UpdateProgress1" style="display:none;" role="status" aria-hidden="true">
  
                <div id="overlay">
                    <div id="modalprogress">
                        <div id="theprogress">
                           <i style="background: #ffffff;" class="fa fa-spinner fa-spin fa-3x stat-elem"></i>
                        </div>
                    </div>
                </div>
            
 </div>
            <script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('scrpt1', 'form1', ['tpnlMain','pnlMain'], [], [], 1000, '');
 //]]>
</script>

            <div>
             
                <div>
                    <table>
                        <tbody><tr>
                            <td>
                              <div id="report_Entity" class="RadComboBox RadComboBox_Silk" style="width:160px;white-space:normal;">
  <!-- 2013.1.220.40 --><table summary="combobox" style="border-width:0;border-collapse:collapse;width:100%" class="">
   <tbody><tr>
    <td class="rcbInputCell rcbInputCellLeft" style="width:100%;"><input name="report_Entity" type="text" class="rcbInput radPreventDecorate rcbEmptyMessage" id="report_Entity_Input" value="Select Entity" autocomplete="off"></td><td class="rcbArrowCell rcbArrowCellRight"><a id="report_Entity_Arrow" style="overflow: hidden;display: block;position: relative;outline: none;">select</a></td>
   </tr>
  </tbody></table><div class="rcbSlide" style="z-index:6000;"><div id="report_Entity_DropDown" class="RadComboBoxDropDown RadComboBoxDropDown_Silk " style="display:none;"><div class="rcbScroll rcbWidth" style="height:200px;width:100%;"><ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;"><li class="rcbItem ">ALL</li><li class="rcbItem ">SPCG0033</li></ul></div></div></div><input id="report_Entity_ClientState" name="report_Entity_ClientState" type="hidden" autocomplete="off">
 </div>
                                    

                            </td>
                            <td>
                                <select name="report_Type" onchange="javascript:setTimeout('__doPostBack(\'report_Type\',\'\')', 0)" id="report_Type" class="selectbox">
  <option selected="selected" value="">Report Type</option>
  <option value="1">Total Subscriber List</option>
  <option value="2">Subscriber List with Active Package</option>

 </select>
                            </td>
                            <td>
                                
                            </td>
                            <td>
                                <input type="submit" name="btn_new" value="Show Data" id="btn_new" class="button">
                            </td>
                            <td>
                                
                            </td>
                            <td>
                                
                            </td>
                        </tr>
                    </tbody></table>
                </div>
                <span id="lbl_error" style="color:White;font-weight:bold;"></span>
                <div>
                    
                </div>
            </div>
        
</div>
    

<script type="text/javascript">
//<![CDATA[
Sys.Application.add_init(function() {
    $create(Sys.UI._UpdateProgress, {"associatedUpdatePanelId":"pnlMain","displayAfter":0,"dynamicLayout":true}, null, null, $get("UpdateProgress1"));
});

WebForm_InitCallback();Sys.Application.add_init(function() {
    $create(Telerik.Web.UI.RadComboBox, {"_dropDownWidth":0,"_height":200,"_postBackReference":"__doPostBack(\u0027report_Entity\u0027,\u0027arguments\u0027)","_skin":"Silk","_uniqueId":"report_Entity","clientStateFieldID":"report_Entity_ClientState","collapseAnimation":"{\"duration\":450}","emptyMessage":"Select Entity","expandAnimation":"{\"duration\":450}","itemData":[{},{"value":"SPCG0033"}],"localization":"{\"AllItemsCheckedString\":\"All items checked\",\"ItemsCheckedString\":\"items checked\",\"CheckAllString\":\"Check All\"}","markFirstMatch":true}, null, null, $get("report_Entity"));
});
//]]>
</script>
</form>


</body></html>

如果您查看 <input id="report_Entity_ClientState" ... > 节点,则该类型是隐藏的。所以我们必须先取消隐藏 WebElement 并按如下方式发送字符:

entityElem = browser.find_element_by_xpath("//input[@id='report_Entity_ClientState']")
browser.execute_script("arguments[0].removeAttribute('type')", entityElem);
entityElem.send_keys('Entity1')
browser.switch_to.frame("ContentPlaceHolder1_myIframe")

我不得不在尝试查找元素之前添加这一行。现在@DebanjanB 和@Ratmir Asanov 提到的所有方法都可以完美运行。感谢您一直以来的支持。