Python selenium切换到iframe以定位元素

Python selenium切换到iframe以定位元素,python,selenium,iframe,compiler-errors,fancybox,Python,Selenium,Iframe,Compiler Errors,Fancybox,目前,我遇到以下错误: selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.maximize_

目前,我遇到以下错误:

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

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("website")

driver.find_element_by_id("fld-username").send_keys("username")
driver.find_element_by_id("fld-password").send_keys("password")
driver.find_element_by_id("btn-inloggen").click()
driver.find_element_by_css_selector("div.block-position-top > p:nth-child(3) > a").click()

frame = driver.find_element_by_xpath("//iframe[@class='fancybox-iframe' and starts-with(@id,'fancybox-frame') and contains(@src,'/reminder/add/relation/')]")

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(frame))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='submit button' and @id='btn-opslaan']"))).click()

driver.switch_to.default_content()

driver.quit()
这让我认为我没有正确地切换到iframe。我尝试过无数种方法,包括隐式和显式等待

这是框架的html:(我右键单击并复制了chrome中的元素)


如果我打开iframe源页面,还有一些额外的iframe元素:(按钮行块是我要单击的定位器所在的位置)


托沃根议程
托格韦岑
昂德韦尔普
*
奥默金根
赫林内伦酒店
*
dd mm jjj

*=verplicht

要单击以检查切换到帧是否成功的按钮的元素:

<body id="popup-body">
<h1>Toevoegen Agenda</h1><form method="POST" id="form-reminder-add-default" class="block-form" action="/reminder/add/relation/58048" ><input type="hidden" name="form-submit-id-default" id="fld-form-submit-id-default" value="form-reminder-add-default" /><input type="hidden" name="formNonce" id="fld-formNonce" value="ZTllOGNhZDdkOTZlYWM0NzVkZTI4NzI4NWE5MDAyZGI3NGMzZDEuNjU5ODY3ODY=" /><input type="hidden" name="id" id="fld-id" value="" /><input type="hidden" name="status" id="fld-status" value="0" /><div class="field-row">
<label for="fld-assignedTo">Toegewezen aan</label>

<div class="field-row">
<label for="fld-title">Onderwerp</label>
<div class="fld-required"><span>*</span></div>
<input type="text" name="title" id="fld-title" class="required" /><div id="status-fld-title" class="fld-status"><img src="/img/fieldicons/loader.gif" id="loader-fld-title"></div><div class="clear"><!-- empty --></div>
</div>

<div class="field-row">
<label for="fld-body" class="textarea">Opmerkingen</label>
<div class="fld-required"><!--no--></div>
<textarea  name="body" id="fld-body" class="tiny"></textarea><div id="status-fld-body" class="fld-status"><img src="/img/fieldicons/loader.gif" id="loader-fld-body"></div><div class="clear"><!-- empty --></div>
</div>

<div class="field-row">
<label for="fld-remindOn">Herinneren op</label>
<div class="fld-required"><span>*</span></div>
<input type="text" name="remindOn" id="fld-remindOn" class="required" value="23-02-2018" /><div id="status-fld-remindOn" class="fld-status valid"><img src="/img/fieldicons/loader.gif" id="loader-fld-remindOn"></div><span class="fieldtip">dd-mm-jjjj</span>
<div class="clear"><!-- empty --></div>
</div>

<div class="button-row"><p class="error submit-error-message"></p><p class="required-message">* = verplicht</p><input name="Opslaan" type="submit" id="btn-opslaan" class="submit button" value="Opslaan" /><input name="Annuleren" type="button" id="btn-annuleren" class="submit-sibling button" onclick="parent.history.back();  return false;" value="Annuleren" /><img src="/img/form-loader.gif" alt="loading" class="loading" /></div><div class="clear"></div></form>    </body>
</html>

根据您对框架内元素的
单击()
的评论,您可以使用以下代码行:

<input name="Opslaan" type="submit" id="btn-opslaan" class="submit button" value="Opslaan">

可能是@adbSOeh的副本,如果使用
driver.switchTo.frame(0)
driver.switchTo.frame(1)
,我会在Java中实现同样的效果。我不知道如何在Python中实现同样的功能。@DebanjanB在另一个线程中,我给出了对我帮助最大的问题的最佳答案。。我还是没能解决这个问题。请你再看一眼好吗?@DebanjanB如果你忘记了,请提醒一下。你可以通过
驱动程序在一个框架内共享元素的HTML。通过id(“btn Opslan”)查找元素。
。您看到的错误是
没有这样的元素:无法定位元素:{“方法”:“id”,“选择器”:“btn opslan”}
。可能定位器不正确。这给了我一个timeoutexception:-(.它找不到元素。你能用你正在尝试自动化的确切手动步骤和顺序代码块更新问题吗。到目前为止,每一行都是分散的,调试相当困难。正如你在评论中提到的,你的问题中没有
元素。
<body id="popup-body">
<h1>Toevoegen Agenda</h1><form method="POST" id="form-reminder-add-default" class="block-form" action="/reminder/add/relation/58048" ><input type="hidden" name="form-submit-id-default" id="fld-form-submit-id-default" value="form-reminder-add-default" /><input type="hidden" name="formNonce" id="fld-formNonce" value="ZTllOGNhZDdkOTZlYWM0NzVkZTI4NzI4NWE5MDAyZGI3NGMzZDEuNjU5ODY3ODY=" /><input type="hidden" name="id" id="fld-id" value="" /><input type="hidden" name="status" id="fld-status" value="0" /><div class="field-row">
<label for="fld-assignedTo">Toegewezen aan</label>

<div class="field-row">
<label for="fld-title">Onderwerp</label>
<div class="fld-required"><span>*</span></div>
<input type="text" name="title" id="fld-title" class="required" /><div id="status-fld-title" class="fld-status"><img src="/img/fieldicons/loader.gif" id="loader-fld-title"></div><div class="clear"><!-- empty --></div>
</div>

<div class="field-row">
<label for="fld-body" class="textarea">Opmerkingen</label>
<div class="fld-required"><!--no--></div>
<textarea  name="body" id="fld-body" class="tiny"></textarea><div id="status-fld-body" class="fld-status"><img src="/img/fieldicons/loader.gif" id="loader-fld-body"></div><div class="clear"><!-- empty --></div>
</div>

<div class="field-row">
<label for="fld-remindOn">Herinneren op</label>
<div class="fld-required"><span>*</span></div>
<input type="text" name="remindOn" id="fld-remindOn" class="required" value="23-02-2018" /><div id="status-fld-remindOn" class="fld-status valid"><img src="/img/fieldicons/loader.gif" id="loader-fld-remindOn"></div><span class="fieldtip">dd-mm-jjjj</span>
<div class="clear"><!-- empty --></div>
</div>

<div class="button-row"><p class="error submit-error-message"></p><p class="required-message">* = verplicht</p><input name="Opslaan" type="submit" id="btn-opslaan" class="submit button" value="Opslaan" /><input name="Annuleren" type="button" id="btn-annuleren" class="submit-sibling button" onclick="parent.history.back();  return false;" value="Annuleren" /><img src="/img/form-loader.gif" alt="loading" class="loading" /></div><div class="clear"></div></form>    </body>
</html>
<input name="Opslaan" type="submit" id="btn-opslaan" class="submit button" value="Opslaan">
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='submit button' and @id='btn-opslaan']"))).click()