【问题标题】:How do I switch to a frame and select an element in the frame?如何切换到框架并选择框架中的元素?
【发布时间】:2021-03-25 08:28:12
【问题描述】:

我正在尝试选择框架“mainFrame”。

页面来源是:

<frameset rows="89,*" frameborder="NO" border="0" framespacing="0">
    <frame name="topFrame" scrolling="NO" noresize src="inc-webpage/b-topnav.asp">
        <frameset rows="*,20" frameborder="NO" border="0" framespacing="0">
            <frameset cols="175,*" frameborder="NO" border="0" framespacing="0">
                <frame name="leftFrame" scrolling="AUTO" noresize src="inc-webpage/b-sidenav-3.asp">
                <frame name="mainFrame" src="b-default.asp">
            </frameset>
            <frame name="bottomFrame" scrolling="NO" noresize src="inc-webpage/b-footer.asp">
        </frameset>
</frameset>
<noframes>

我希望选择的元素在“mainFrame”中。因此我的代码是:

time.sleep(5)    
driver.switch_to.frame("mainFrame");
driver.find_element_by_xpath("//a[contains(text(),'I Agree')]").click()

是的。 time.sleep() 不太理想,所以我只是暂时使用它。

这是我希望在“mainFrame”中选择的元素的 HTML:

<input type="button" value="I Agree" 
class="btn" onmouseover="blueBtnOver(this)" onmouseout="blueBtnOut(this)" 
onclick="javascript:location.href='b-3c-pLessonBooking.asp?limit=pl'" style="background: rgb(0, 102, 204);">

目前出现此错误:

NoSuchFrameException(frame_reference) selenium.common.exceptions.NoSuchFrameException:消息:mainFrame

我是一个绝对的初学者。 driver.find_element_by_xpath 可能是错误的

另外,为什么有些网站使用框架//框架集,而其他网站使用 iframe,而有些则不使用?

【问题讨论】:

  • 按钮 I Agree 不在您发布的框架内。如果有任何框架,您需要检查 DOM 和该按钮的父级?它应该像&lt;frame&gt;#document &lt;html&gt;button element&lt;/html&gt;&lt;/frame&gt;

标签: python selenium-webdriver frames frameset


【解决方案1】:

基本上等frame切换到它,然后点击匹配值的输入我同意。

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

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("mainFrame"))
driver.find_element_by_xpath("//input[@value='I Agree']").click()

【讨论】:

  • 代码返回超时错误;它可能找不到框架
  • 页面加载时间是否较长>
  • 不;我有一个以太网连接,我什至设置了 driver.sleep(30) 以确保
【解决方案2】:

所需元素嵌套在多个 &lt;frame&gt; 元素中,因此您必须:

  • 诱导WebDriverWait 使 框架可用并切换到它

  • 诱导 WebDriverWait 使 child 框架可用并切换到它

  • 诱导WebDriverWait 使所需的元素可点击

  • 您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='topFrame']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='mainFrame']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.btn[value='I Agree']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='topFrame']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='mainFrame']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='btn' and @value='I Agree']"))).click()
      
  • 注意:您必须添加以下导入:

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

参考

您可以在以下位置找到一些相关讨论:

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2017-12-03
    • 2013-12-02
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多