【问题标题】:How to switch between iframes using Selenium and Python?如何使用 Selenium 和 Python 在 iframe 之间切换?
【发布时间】:2021-03-16 04:21:39
【问题描述】:

我正在尝试在 Shopify 网站上制作结帐脚本,并且能够找到卡号的 iframe,但无法找到卡上名称的 iframe(第二个 iframe)。有什么方法可以输入该 iframe 的值吗?

driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
driver.find_element_by_xpath('//input[@autocomplete="cc-number"]').send_keys("1234")
driver.find_element_by_xpath('//div[@data-card-field-placeholder="Name on card"]').click()
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
driver.find_element_by_xpath('//input[@autocomplete="cc-name"]').send_keys("First Last")

我试过了

driver.find_element_by_xpath('//input[@autocomplete="cc-name"]').send_keys("First Last")

它让我无法找到元素

图片供参考:https://imgur.com/a/cx7tByw

【问题讨论】:

    标签: python selenium selenium-webdriver iframe webdriverwait


    【解决方案1】:

    卡号姓名字段在不同的<iframe>,所以你必须:

    • 诱导WebDriverWait 使所需的帧可用,并为卡号字段切换到它

    • 切换到默认内容

    • 诱导WebDriverWait 使所需的帧可用,并为name 字段切换到它

    • 您可以使用以下基于Locator Strategies 之一:

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='card-fields-iframe' and starts-with(@id, 'card-fields-number')]")))
      # perform other operations
      driver.switch_to.default_content()
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='card-fields-iframe' and starts-with(@id, 'card-fields-name')]")))
      
    • 注意:您必须添加以下导入:

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

    参考

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

    【讨论】:

      【解决方案2】:

      像处理任何其他元素一样使用唯一定位器

      切换到帧的语法是

         driver.switch_to.frame(WebElement)
      

      所以你不需要只使用标签名称,你可以像任何其他元素一样使用 xpath 、 Id 、 css 等

      我们通常使用标签,因为大多数情况下只有一个 iframe。如果您有多个 iframe,则使用特定 iframe 的任何其他属性(如 Id、class 等)查找每个 iframe,就像您为其他元素所做的一样

      driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@id="card-fields-name-fpsn1ey65to00000"]'))

      【讨论】:

      • 试过了,但没用driver.switch_to.frame(driver.find_element_by_xpath('iframe[id="card-fields-name-fpsn1ey65to00000"]'))
      • 你必须把@id而不是id
      • //iframes[@id="!$!+
      • 您使用的是 css 定位器而不是 xpath ,请阅读 xpatha 和 css 中的基本元素定位器
      • 如果有帮助请采纳答案,前一个也是。删除已接受的答案不是一个好习惯,因为我们会花费时间和精力来调试并帮助您修复代码。感谢理解
      【解决方案3】:

      我建议使用父标签,因为它有一个更易于识别的 div 标签,可以通过 xpath 访问。这样你就可以在找到要发送密钥的输入标签之前转到你想要的 iframe。

      driver.switch_to.frame(driver.find_element_by_xpath("div[@data-card-fields='number']/iframe"))
      

      【讨论】:

      • 嗯,我刚试过这个,它给了我“无法定位元素”。我尝试切换回默认内容并返回,但都不起作用
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2020-07-22
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      相关资源
      最近更新 更多