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)
以下是您收到 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)
| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |