当前位置: 首页 > 知识库问答 >
问题:

Selenium Python-无法单击iframe中的复选框,该iframe绑定到在隐藏元素中更新值的标签

赏阳嘉
2023-03-14

我有一个表单页面,用于使用复选框请求访问服务器的一个或两个密码/RDP。默认情况下选中RDP。我也想检查一下密码。表单有一个框架,框架内有

  • 文本“访问请求”的标签

我想点击第一个密码复选框。

以下是html源代码:

<div class="control-group access-type">
    <label class="control-label" data-bind="text: translate('view_new_requests:access_request_lbl', { defaultValue: 'Access Request:'})">Access Request:</label>
    <div class="controls div-access-type" data-bind="visible: accessTypes().length > 0">
        <input type="hidden" id="hiRequestAccessType" data-bind="value: requestAccessTypeStr" value="2">
        <div class="retinaCS-validation-message" style="display: none; top: 210.812px; left: 183px; opacity: 0;">
            <em></em>
            <div style="display: table">
                <div class="retinaCS-validation-message-text" style="display: table-cell" data-bind="validationMessage: field"></div>
            </div>
        </div> 
        <!-- ko foreach: $root.accessTypes -->
        <label data-bind="css: 'checkbox' + '&nbsp;' + cssClassName()" class="checkbox viewpwd">
            <input name="rbtnAccessType" type="checkbox" data-bind="value: bitValue(), enable: enabled(), checked: $root.requestAccessTypeStr" value="1">
            <!-- ko text: title() -->Password<!-- /ko -->
        </label>
        <br>                                     
        <label data-bind="css: 'checkbox' + '&nbsp;' + cssClassName()" class="checkbox rdpaccess">
            <input name="rbtnAccessType" type="checkbox" data-bind="value: bitValue(), enable: enabled(), checked: $root.requestAccessTypeStr" value="2">
            <!-- ko text: title() -->RDP Session<!-- /ko -->
        </label>
        <br> 
        <!-- /ko -->
    </div>
    <div class="controls read-only-label" data-bind="visible: accessTypes().length == 0" style="display: none;">
        <span class="form-value-label" data-bind="text: translate('view_new_requests:no_accessTypes_lbl', { defaultValue: 'No access request types available. Contact your administrator.'})">No access request types available. Contact your administrator.
        </span>
    </div>                            
</div>

注:

wait = ui.WebDriverWait(driver, 10)

其中driver是Chromedriver实例。另外,我已经切换到前面提到的框架。

我尝试了以下方法:

1.将隐藏元素的值设置为“2,1”:

passwordcheck_input_element = driver.find_element_by_css_selector("#hiRequestAccessType")
new_value = '2,1'
driver.execute_script("arguments[0].value = arguments[1].toString()", passwordcheck_input_element, new_value)

2.直接点击复选框:

chckbox = wait.until(EC.element_to_be_clickable((By.NAME, "rbtnAccessType")))

chckbox = driver.find_element_by_xpath("//label/input[contains(..,'Password')]")

然后

chckbox.click()

这就是我所看到的:

1.该值成功地更改为2,1,但没有选中密码框,因此不会发生任何实际情况。点击进入下一页后,在后端选择的只有RDP。

2.什么也没发生。没有错误,但也没有复选框操作。我认为它没有找到checkbox元素,而是找到了其他元素。如果我查询chckbox。AccessTNI返回“预期WebName”属性,其中,AccessTNI返回“预期WebName”属性。

共有1个答案

况鸿雪
2023-03-14

很大程度上取决于您如何切换到上述帧。

超文本标记语言似乎是动态生成的,因此要识别中所需的元素并与之交互

>

  • 诱导WebDriverWait以使所需帧可用并切换到该帧
  • 诱导WebDriverWait使所需元素可单击
  • 您可以使用以下任一解决方案:
  • 使用CSS\u选择器

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe_css_selector")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label.viewpwd>input[name='rbtnAccessType'][value='1']")))
    

    使用XPATH

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"iframe_xpath")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[contains(@class,'viewpwd')]/input[@name='rbtnAccessType' and @value='1']")))
    

    注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

    参考文献:

    • iframe下#文档的处理方法
    • 我怎样才能选择一个html元素,不管它在selenium中的哪个帧中?

  •  类似资料:
    • 我知道我必须切换到一个iframe当我想要点击和元素在它里面。iFrame的开头是这样的: 我使用切换到它 然后,我尝试单击Iframe中的“Join”按钮,使用它的XPath: 在一张桌子里面。 我可以选择“以前的会议”选项卡,但不能使用加入或邀请按钮。 这两个图像只是一个接着一个。

    • 我正在学习使用Java和Eclipse IDE的Selenium测试自动化。我正在尝试开发自己的XPAHT,但我在浏览器上安装了Chropath来帮助解决我自己无法解决的问题。在尝试与play按钮交互时,我遇到了以下问题几次。测试的目标是导航到网站的播客页面,选择一个播客,点击播放按钮。我尝试开发自己的xpath,但没有找到任何工作的xpath。我检查了Chropath插件,得到了这样的消息: 它

    • 我对selenium的第一个测试是单击网站上的按钮。我需要点击的第一个按钮是“是的,你可以使用cookies”——网站弹出窗口中的按钮。但似乎selenium并没有找到那个按钮,即使我添加了一条等待线。我也尝试了弹出窗口中的其他按钮,但是我的元素找不到任何一个可以点击的按钮。元素在iframe中,所以我想我必须更改为它,但似乎我做错了什么。 这就产生了错误 如果我尝试在更改为iframe后直接单击

    • 问题内容: 在我们的应用程序中,我们解析一个网页并将其加载到iFrame中的另一个页面中。该加载页面中的所有元素都有其令牌标识。我需要通过那些tokenid -s选择元素。意思是-我单击主页上的元素,然后在iFrame中选择页面中的相应元素。在jQuery的帮助下,我通过以下方式进行操作: 但是,通过此功能,我只能选择当前页面中的元素,而不能选择iFrame中的元素。谁能告诉我如何在加载的iFra

    • 我用selenium加载一个页面:http://www.legorafi.fr/接下来,我尝试单击“Tout Accepter”按钮,但即使使用css选择器,它也不起作用。是给饼干的。 我试过这样的方法: 这是带有文本“Tout Accepter”的蓝色按钮 我该怎么办?

    • 问题内容: 到目前为止,这就是我所拥有的:我已将框架切换到其父框架,然后又切换到了我无法找到的框架: 由于找不到“ frame”元素,因此出现此错误: org.openqa.selenium.NoSuchElementException:无法找到元素 HTML: 我要定位的iframe位于多个div中。它与错误有关系吗?还是我的元素查找方式有问题? 问题答案: 按照HTML,一旦进入 父框架 ,就