Python 3 Selenium - 选择没有名称的动态生成的iframe

时间:2017-11-03 15:03:41

标签: python-3.x selenium iframe

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

&#34; stripeXDM_default441361_provider&#34;是动态的,每次弹出警报时都会更改。

我尝试过switch_to.frame但是无法正确使用它。 我还尝试选择动态生成的iframe,其中&#34; Xpath包含&#34;但也没用。

有关如何选择没有名称的iframe的任何建议吗?

2 个答案:

答案 0 :(得分:0)

要选择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']"))

标识名称为&#39; A1&#39;的元素和文字&#39; One&#39;。

但是:

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

所以,在你的情况下,你可以找到&#34;外部&#34; iframe元素和&#34;内部&#34;一个(我假设没有其他iframe)。像这样:

//iframe/iframe

选择iframe后,您必须switch to it

答案 1 :(得分:0)

事实证明我过于复杂。我不需要改变焦点或其他任何东西。 我只是假设它都是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()

这就是我所做的和完美的工作。