【问题标题】:Access iframe input element with Webdriver/Python使用 Webdriver/Python 访问 iframe 输入元素
【发布时间】:2020-01-04 05:25:21
【问题描述】:

我有一个动态生成的 iframe 元素(输入类型),需要将其存储为变量。 iframe 看起来像:

<iframe id="iframe39993" class="green tea" src="...foo"> 
 #document
 <!doctype html>
  <html>
   <head>...</head>
    <body style>
      <div id="layout" class=container>
        <div class="row">
          <input class="required" type="number">
         </div>
       </div>
     </body>
    </html>

我正在使用 Selenium/Webdriver 来执行此操作:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.switch_to.frame(driver.find_element_by_class_name('green tea'))
content = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//* [@id='layout']/div[1]/input")))
print(content.text)
driver.switch_to.default_content()
driver.quit()

由于某种原因,我只得到一个换行符(空字符串)作为输出。我很确定,xpath 应该是正确的,但不能打印(或存储)iframe 元素。 iframe 元素已经包含我需要访问的用户输入数据。有人有什么想法吗?

【问题讨论】:

  • 错误是什么?
  • 更新了问题。出现拼写错误,重新检查代码后,我得到一个没有任何错误的换行符。
  • 我也可以使用 ActionChains 复制 iframe 内容,但只能将它们粘贴到浏览器中。不幸的是,需要将输入作为变量。

标签: python selenium iframe


【解决方案1】:

您的定位器.find_element_by_class_name('green tea') 将不起作用,因为.find_element_by_class_name() 只接受一个类名,并且您已经传递了两个,“green”和“tea”。如果您想使用这两个类来定位元素,更好的选择是 CSS 选择器,.green.tea

另一个问题是INPUT 元素不包含文本,它们包含值。要从INPUT 获取值,您需要使用.get_attribute('value') 而不是.text

根据以上两项更新您的代码,

driver = webdriver.Chrome()
driver.switch_to.frame(driver.find_element_by_css_selector('.green.tea'))
content = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='layout']/div[1]/input")))
print(content.get_attribute('value'))
driver.switch_to.default_content()
driver.quit()

一些 CSS 选择器参考:
W3C
Selenium Tips: CSS Selectors
Taming Advanced CSS Selectors

【讨论】:

  • 非常感谢!这完全解决了我的问题。我已经用 key_send 上的击键复制+粘贴了输入,并将其与剪贴板一起粘贴为值,但​​你的方式更优雅。
【解决方案2】:

您试图定位的&lt;input&gt; 标签:

<input class="required" type="number">

没有任何textinnerHTML 这样的。所以代码行:

print(content.text)

总是会打印一个空字符串。

在这里你可以找到Ways to deal with #document under iframe的相关讨论

【讨论】:

  • 谢谢您,先生。这完全解释了它! iframe 文本框本身不为空。有没有办法访问它?
  • @robscure 因为它是一个&lt;input&gt; 标签,你可以在其中使用click()send_keys()
  • 这是个好主意,我玩了一下。我可以使用 send_keys() 复制 iframe 的输入。但是我怎样才能将它存储为变量呢?我需要在 python 代码中验证它。感谢您的宝贵时间。
  • @robscure 您不会复制&lt;input&gt; 标记的textinnerHTML,而是在元素内发送text。当您自己发送 文本 时,您可以在 Web 应用程序处理文本(您发送的文本)并在网页中的某处反映时验证它。
  • 我明白了。我以为我可以将它直接存储为变量。谢谢!!
猜你喜欢
  • 2021-03-02
  • 2016-03-22
  • 2015-06-16
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多