提问者:小点点

访问iframe输入元素与网络驱动程序/Python


我有一个动态生成的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/Web驱动程序来做到这一点:

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元素包含已经用户输入的数据,我需要访问这些数据。有人有什么想法吗?


共2个答案

匿名用户

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

另一个问题是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
硒提示:CSS选择器
驯服高级CSS选择器

匿名用户

的<代码>

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

没有任何textinnerHTML本身。所以代码行:

print(content.text)

将始终打印一个空字符串。

在这里你可以找到关于iframe下处理#文档的方法的相关讨论