无法从嵌套框架切换到主页



我有一个程序,可以在PLM平台ENOVIA上自动输入数据,并输入我输入的特定信息。我正在使用Selenium来浏览网页。有一个片段,程序必须输入 4 个嵌套帧才能单击某个元素。它做得很好并进行必要的编辑,我面临的问题是当我尝试退出框架回到 HTML 代码的顶部以使用switch_to.default_content()返回主页时。出于某种原因,在它切换到嵌套帧的第 4 个子帧并进行这些编辑后,我看到窗口更改为仅包含这些帧及其中的内容,而不包含第一个父帧之上的任何内容。所以switch_to.default_content()似乎不起作用。

这是真正重要的代码,它切换到第 4 帧也是最后一帧"DSCObjectSummary"并进行这些编辑


def clickCheck(Method, Locator, elemName):
#Add If Else to check for element availibility
#Do Retries of searchess
try:
wait.until(EC.element_to_be_clickable((Method, Locator)))
print(elemName + ' Clickable')
except NoSuchElementException:
print("Cannot Find Element")
...... Lots of code and comes to this point
#Switching into 4 nested frames to click "EDIT DETAILS" Button
wait.until(EC.frame_to_be_available_and_switch_to_it("content"))
wait.until(EC.frame_to_be_available_and_switch_to_it("detailsDisplay"))
wait.until(EC.frame_to_be_available_and_switch_to_it("portalDisplay"))
wait.until(EC.frame_to_be_available_and_switch_to_it("DSCObjectSummary"))
clickCheck(By.ID, 'DSCEditObjectSummary', "Edit Details")
elemEdit = browser.find_element_by_id("DSCEditObjectSummary")
elemEdit.click()
#Click the Customer Dropdown
clickCheck(By.ID, "PMCCustomerId", "Customer Dropdown")
elemCust = browser.find_element_by_id("PMCCustomerId")
elemCust.click()
elemCust.send_keys("Ces")
"""Add If Conditions to check part number"""
#Click Document Type Field
clickCheck(By.ID, "PMCDocumentTypeId", "Document Type")
elemDoc = browser.find_element_by_id("PMCDocumentTypeId")
elemDoc.click()
elemDoc.send_keys("MOD")
"""Add Check to see if part is Active/Obsol, if Obs, make Active"""
#Click Dashnumber field
clickCheck(By.ID, "PMCDashNumber", "Dash Number")
elemDash = browser.find_element_by_id("PMCDashNumber")
elemDash.click()
elemDash.clear()
elemDash.send_keys("-1")
#Click Done Button
clickCheck(By.CSS_SELECTOR, "button[class='btn-primary'][type='button']", "Done Button")
elemDone = browser.find_element_by_css_selector("button[class='btn-primary'][type='button']")
elemDone.click()
browser.switch_to.default_content()
time.sleep(20)

我尝试按顺序使用switch_to.frame(framename) 从第 4 个父帧向后切换到第 1 个父帧,然后使用switch_to.default_content()只是抛出一个 NoSuchFrameException。我想要的只是能够回到框架中,就像我进入它们一样,而无需更改/删除窗口中的任何内容并返回到顶级 HTML。

尝试查找所有iframe并切换到所需的iframe。

// find all your iframes
List<WebElement> iframes = driver.findElements(By.xpath("//iframe"));
// print your number of frames
System.out.println(iframes.size());
// you can reach each frame on your site
for (WebElement iframe : iframes) {
// switch to every frame
driver.switchTo().frame(iframe);
// now within the frame you can navigate like you are used to
}

作为driver.switch_to.default_content()的替代方法,您还可以使用:

browser.switch_to.parent_frame()

更新

由于您仍然面临相同的问题,更好的方法是等待elemDone.click()步骤完成(JavaScript/Ajax 调用),您可以诱导WebDriverWait进行一些visibility_of_element_located(),如下所示:

elemDone = browser.find_element_by_css_selector("button[class='btn-primary'][type='button']")
elemDone.click()
WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "css_of_an_element_which_gets_displayed_after_the_click")))
browser.switch_to.default_content()
# as an alternative use `switch_to.parent_frame()`
# browser.switch_to.parent_frame()

注意:出于调试目的,您可以将WebDriverWait替换为time.sleep(5)


尾声

"格式错误的URL:无法访问死对象"在尝试打开谷歌时在硒中

最新更新