通过 ID 查找的 Selenium Web 驱动程序问题

qwe*_*lpc 1 python selenium automation web-scraping selenium-webdriver

这是我第一次使用 Selenium Web Driver(使用 Python),我试图转到搜索框,输入内容并点击提交。

相关的 HTML 如下所示:

<iframe id="mainFrame" class="" width="100%" height="" frameborder="0" title="Main content frame" onload="initFrame();" scrolling

....

<tr>

    <td style="vertical-align:middle;">
         <input id="terms" type="text" onblur="RevertText(this,'Enter Search Terms');" onfocus="AllowType(this,'Enter Search Terms')" value="Enter Search Terms" style="color: rgb(164, 164, 164);"></input>
    </td>
    <td style="vertical-align:middle;">
         <input id="srchButt" class="buttAcdmicOne" type="submit" value="Search"></input>
    </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

我的代码如下所示:

driver.switch_to.frame("mainFrame")
elem = driver.find_element_by_id("terms")
elem.send_keys("Test")
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我不知道为什么它不起作用......(可能有多个带有术语 id 的东西?)

编辑:

我收到的错误是:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"id","selector":"terms"}
Run Code Online (Sandbox Code Playgroud)

我收到的新错误是:

selenium.common.exceptions.NoSuchFrameException: Message: no such frame: element is not a frame
Run Code Online (Sandbox Code Playgroud)

<iframe id="mainFrame" class="" width="100%" height="" frameborder="0" title="Main content frame" onload="initFrame();" scrolling

....

<tr>

    <td style="vertical-align:middle;">
         <input id="terms" type="text" onblur="RevertText(this,'Enter Search Terms');" onfocus="AllowType(this,'Enter Search Terms')" value="Enter Search Terms" style="color: rgb(164, 164, 164);"></input>
    </td>
    <td style="vertical-align:middle;">
         <input id="srchButt" class="buttAcdmicOne" type="submit" value="Search"></input>
    </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 5

以下是您收到 2 个常见原因(附有解决方案)NoSuchElementException

  • 该元素位于 an 内iframe,您需要在搜索之前切换到它:

    driver.switch_to.frame("my_frame_id_or_name")
    elem = driver.find_element_by_id("terms")
    elem.send_keys("Test")
    
    Run Code Online (Sandbox Code Playgroud)
  • 执行搜索时该元素尚不存在。等待它

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    terms = wait.until(EC.presence_of_element_located((By.ID, "terms")))
    terms.send_keys("test")
    
    Run Code Online (Sandbox Code Playgroud)

或者,甚至应该将两种解决方案结合起来:

wait = WebDriverWait(driver, 10)
iframe = wait.until(EC.presence_of_element_located((By.ID, "mainFrame")))
driver.switch_to.frame(iframe)

terms = wait.until(EC.visibility_of_element_located((By.ID, "terms")))
terms.send_keys("test")
Run Code Online (Sandbox Code Playgroud)