如何切换到框架并选择框架中的元素



我正在尝试选择框架"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.com.mon.exceptions.NoSuchFrameException:消息:mainFrame

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

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

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

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()

所需元素嵌套在多个<frame>元素中,因此您必须:

  • 诱导WebDriver等待父帧可用并切换到它

  • 诱导WebDriver等待子帧可用,然后切换到它

  • 诱导WebDriver等待所需的元素可点击

  • 您可以使用以下定位策略之一:

    • 使用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
    

参考

你可以在中找到一些相关的讨论

  • 如何处理iframe下的#文档
  • 通过Selenium和python切换到iframe
  • 如何使用带有Selenium的Chrome驱动程序使用Python登录Applemusic