【问题标题】:Browsing context has been discarded error sending text input inside an iFrame Selenium浏览上下文已被丢弃错误在 iFrame Selenium 内发送文本输入
【发布时间】:2021-05-05 05:53:43
【问题描述】:

我试图在网站上输入用户名字段,但我意识到它位于页面上的 iframe 内。 iframe html代码和输入框html代码如下:

<iframe class="_2_i9tg _2_i9tg" src="https://gateway-members.bet365.com/v1/auth/oauth/authorise?client_id=BDE2D5E4-127D-48D4-A963-BB49DC126BF7&amp;scope=sports%20members&amp;response_type=code&amp;redirect_uri=https://secure.oddschecker.com/mapp/b3/callback&amp;state=dXNlcklEOmExNWM4OTUxLTlkY2EtNDQ5OC1iNDc3LWUxNzVhMDdjODdlNVNFUGRldmljZVR5cGU6d2luZG93c1NFUGFwaVJlcHViOmFwaV9PQ1NFUGRldmljZUlkOmExNWM4OTUxLTlkY2EtNDQ5OC1iNDc3LWUxNzVhMDdjODdlNQ"></iframe>

<input autocomplete="off" class="inputtextbox" id="Username" name="Username" placeholder="Username" type="text" value="">

我尝试过多种方式切换到 iframe 并输入文本,例如

WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[@class='_2_i9tg _2_i9tg']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id = 'Username'][@class = 'inputtextbox']"))).send_keys("Username")

my_iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//iframe[@class='_2_i9tg _2_i9tg']")))
driver.switch_to.frame(my_iframe)

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//@id = 'Username'][@class = 'inputtextbox']"))).send_keys("Username")

当我尝试运行此代码时,我收到一条错误消息:

Browsing context has been discarded

当我不尝试切换框架时,我无法找到输入字段元素。 我错过了什么?

【问题讨论】:

  • 您要访问的网站是什么?您的代码看起来或多或少是正确的
  • 网站是oddschecker.com。当我在将选项添加到 betslip 后尝试登录博彩公司时出现问题
  • 很难说没有看到您的确切事件和点击顺序,但是当我在网站上按登录时,登录表单不会加载到新的 iframe 中。
  • 抱歉,我想澄清一下,我并没有尝试登录赔率检查器网站。如果您访问该网站并选择一些内容并将其添加到您的投注单中,您可以选择登录到您选择的博彩公司,例如 bet365。然后出现此登录表单,当我检查它是否在 iframe 中时,我会将屏幕截图添加到我的原始帖子中。
  • 啊,我明白了。不幸的是,投注单对我不起作用,所以我无法排除故障。对不起。

标签: python selenium-webdriver xpath iframe css-selectors


【解决方案1】:

第二次尝试有错别字。如果不能修复,能否提供html代码?

//*[@id = 'Username'][@class = 'inputtextbox']

【讨论】:

  • 这个没有解决,我应该如何提供html代码?我帖子中的行是否不够,我不确定如何复制完整的 html 代码,因为它仅在我尝试时复制特定元素的 html。
  • 没关系,我可以看到你附上的图片,从代码上看,一切看起来都很好。你试过在driver.switch_to.frame(my_iframe)之前添加my_iframe = driver.find_element_by_xpath("//iframe[@class='_2_i9tg _2_i9tg']")
【解决方案2】:

由于带有该元素的元素位于&lt;iframe&gt; 内,因此您必须:

  • 诱导WebDriverWait 使所需的帧可用并切换到它

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

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

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[src^='https://gateway-members.bet365.com/v1/auth/oauth/authorise?client_id']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.inputtextbox#Username[name='Username']"))).send_keys("Eglantine46")
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@src, 'https://gateway-members.bet365.com/v1/auth/oauth/authorise?client_id')]")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='inputtextbox' and @id='Username'][@name='Username']"))).send_keys("Eglantine46")
      
  • 注意:您必须添加以下导入:

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

参考

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

【讨论】:

  • 感谢您的回复,我尝试了多种方法,但此代码仍然返回错误“浏览上下文已被丢弃”
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2018-03-22
  • 2016-11-28
相关资源
最近更新 更多