如何使用Selenium和Python切换到框架中的字段

时间:2017-06-15 19:45:10

标签: python html selenium

我需要帮助使用Selenium和Python来选择看似在框架内的特定元素。我要做的是选择一个窗口(或面板,框架或弹出窗口)内的'id'='kiadvany_cim'元素......我不知道该怎么称呼它,这是它的一部分问题)。

<div id="editKiadvanyPanel_c" class="yui-panel-container focused" style="left: 444px; top: -20px; z-index: 10044; visibility: visible; opacity: 1;">
<div id="editKiadvanyPanel" class="yuiPanel e yui-module yui-overlay yui-panel" style="visibility: inherit; width: 1040px;">
<div id="editKiadvanyPanel_h" class="hd" style="cursor: move;"> Add book from .epub </div>
<div id="editKiadvanyPanelBd" class="bd">
<form id="editKiadvanyForm" class="noMargin form-horizontal" enctype="application/x-www-form-urlencoded" method="post" action="/books/edit/?type=edit">
<fieldset id="fieldset-editKiadvanyForm" class="noMargin form-horizontal">
<input id="kiadvany_id" class="defZero" name="id" value="0" type="hidden">
<input id="kiadvany_dt_row" class="defZero" name="dt_row" value="0" type="hidden">
<input id="kiadvany_table" name="table" value="dt" type="hidden">
<input id="kiadvany_kozremukodo" class="defEmptyString" name="kozremukodo" value="" type="hidden">
<input id="kiadvany_token" class="defEmptyString" name="token" value="" type="hidden">
<input id="kiadvany_upload_book_token" class="defEmptyString" name="upload_book_token" value="" type="hidden">
<input id="kiadvany_upload_cover_token" class="defEmptyString" name="upload_cover_token" value="" type="hidden">
<input id="kiadvany_ifi" class="defZero triggerChange" name="ifi" value="0" type="hidden">
<table class="bc">
<tbody>
<tr>
<td class="upload">
<td class="inputs pr-1">
<div class="form-group">
<div class="form-group noMarginBottom">
<div class="checkbox" style="margin: -8px auto 16px 2px;">
<div id="kozremukodoOuter" class="form-group m-b-1">
<div class="form-group">
<label class="required" for="kiadvany_cim">Title</label>
<input id="kiadvany_cim" class="triggerChange form-control vRequired vNotEmpty-T hasValidator" name="cim" value="" title="Title" placeholder="Title" data-label-text="Title" type="text">
</div>
<div class="form-group pullUp defHidden hide" style="display: none;">
<div class="form-group katC kat1C">
<div class="form-group pullUp defHidden katC kat2C" style="display: none;">
<div class="form-group pullUp defHidden katC kat3C" style="display: none;">
<div class="form-group" style="display: none;">
<div class="checkbox" style="">
<div class="form-group">
<div class="form-group pullUp defHidden" style="display: none;">
<div class="form-group">
<div class="form-group defHidden pullUp" style="display: none;">
<div class="form-group">
</td>
<td class="inputs">
</tr>
</tbody>
</table>
</fieldset>
</form>
<div class="alert alert-info alert-sm alert-noautoclose text-center mb-0">
</div>
<div class="ft clearfix">
</div>
</div>

我尝试过使用:

driver.switch_to_frame("editKiadvanyForm")

driver.switch_to_window("editKiadvanyForm")

driver.switch_to_frame("editKiadvanyPanel")

driver.switch_to_window("editKiadvanyPanel")

但他们都没有为我工作。我得到了selenium.common.exceptions.NoSuchFrameException: Message: no such frame

selenium.common.exceptions.NoSuchFrameException: Message: no such window

当我尝试只查找没有框架

的元素时
titleField = browser.find_element_by_id('kiadvany_cim')

我得到了

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

我不知道还能做什么。我看过http://selenium-python.readthedocs.io/navigating.html#filling-in-forms,但除了他们切换到窗口/框架的建议外,我很遗憾。任何帮助,将不胜感激。谢谢!

如果我需要提供更多详细信息,请告知我们。

1 个答案:

答案 0 :(得分:1)

该元素不太可能位于iframe或新窗口内。您可能需要等到它变得可见

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

wait(driver, 10).until(EC.visibility_of_element_located((By.ID, "kiadvany_cim")))

或检查它是否是id="kiadvany_cim"print(len(driver.find_elements_by_id("kiadvany_cim")))

的唯一元素

如果有两个或多个具有相同id属性值的元素,您可以尝试使用index来处理正确的元素

driver.find_elements_by_id("kiadvany_cim")[1]