【问题标题】:Python 3 Selenium - select dynamically generated iframe without a namePython 3 Selenium - 选择没有名称的动态生成的 iframe
【发布时间】:2017-11-03 15:03:40
【问题描述】:

(使用 Python 3 和 Selenium。在按下“Shuffle”链接后尝试与 Buffer.com 的警报窗口进行交互。)

在主浏览器框架上按下一个按钮后,会弹出一个带有两个按钮的警报。我想按其中一个。

我正在尝试将焦点更改为包含警报的 iframe,但我看不到它有名称。这是所述警报 iframe 的代码:

<iframe src="https://js.stripe.com/v2/m/outer.html#referrer=https%3A%2F%2Fbuffer.com%2Fsignin&amp;title=Buffer&amp;url=https%3A%2F%2Fbuffer.com%2Fapp%2Fprofile%2F55e5cd556321154607cc5244%2Fbuffer%2Fqueue%2Flist&amp;muid=c7aa769e-c41c-4e86-b75f-99771764f6a5&amp;sid=26221bdc-c091-42c2-8965-8ea3e84267e2&amp;preview=false&amp;" frameborder="0" allowtransparency="true" scrolling="no" tabindex="-1" aria-hidden="true" style="width: 1px !important; height: 1px !important; position: fixed !important; visibility: hidden !important; pointer-events: none !important;"></iframe>

反过来,包含此 iframe 的元素有一个名称,但它是动态生成的。包含我想要的iframe的上层iframe的代码是:

<iframe name="stripeXDM_default441361_provider" id="stripeXDM_default441361_provider" aria-hidden="true" src="https://js.stripe.com/v2/channel.html?stripe_xdm_e=https%3A%2F%2Fbuffer.com&amp;stripe_xdm_c=default441361&amp;stripe_xdm_p=1#__stripe_transport__" frameborder="0" style="position: absolute; top: -2000px; left: 0px;"></iframe>

“stripeXDM_default441361_provider”是动态的,每次弹出警报时都会发生变化。

我尝试过 switch_to.frame 但无法正确处理。 我还尝试使用“包含 Xpath”选择动态生成的 iframe,但也没有工作。

关于如何选择这个没有名称的 iframe 有什么建议吗?

【问题讨论】:

    标签: python-3.x selenium iframe


    【解决方案1】:

    要选择 iframe,您可以使用 xpath。例如,如果我们考虑这个 html:

    <!DOCTYPE html>
    <html>
    <body>
    
    
    <span id="n2">
    
        <span id="n6">
            <a class="cn" name= "A1" >One</a>
    
        </span>
    
        <span id="n7">
             <a class="cn" name= "A2" >Two</a>
        </span>
    
        <span id="n8">
            <a class="cn" name= "A3" >Three</a>
        </span>
    </span>
    
    
    </body>
    </html>
    

    你可以这样做:

    driver.find_element_by_xpath(("//span[@id='n2']/span[@id='n6']/a[@name='A1' and text()='One']"))
    

    识别名称为“A1”和文本为“One”的元素。

    还有:

    driver.find_element_by_xpath(("//span/span[1]/a[@name='A1' and text()='One']"))
    

    因此,在您的情况下,您可以在“内部”元素之后找到“外部”iframe 元素(我假设没有其他 iframe)。像这样的:

    //iframe/iframe
    

    选择 iframe 后,您必须switch to it

    【讨论】:

      【解决方案2】:

      事实证明我把事情复杂化了。我不需要改变焦点或其他任何东西。 我只是假设它都是 html 并且我尝试使用 xpath 直接选择元素,如下所示:

      #do something
      #press shuffle button
      #once the button appears in the iframe, blurring everything else, use this line:
          button = browser.find_element_by_xpath('//*[@id="modal-buttons"]/a[2]')
          button.click()
      

      这就是我所做的并且完美地工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 2021-05-05
        • 2011-11-23
        相关资源
        最近更新 更多