我试图找到一个输入类型="file"的元素,然而,在研究了许多不同的方法和方法之后,基于XPath、CSS选择器、标签等在页面上简单地定位一个元素。脚本遇到NoSuchElementException。元素在iFrame中
例外是:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"div.jsx-2404389384"}
导致异常的代码是:
driver.find_element(by=By.CSS_SELECTOR, value='div.jsx-2404389384')
如有任何意见,我将不胜感激,谢谢
编辑:网页上的实际元素是:
<input type="file" accept="video/*" class="jsx-2404389384 " style="display: none;">
对不起,元素是在一个iframe…我一直在尝试不同的方法来解决这个问题,我必须看看iframe部分:|
您需要根据它的类型而不是它的类名来定位元素,因为这里出现的类名似乎是一个动态值。
试试这个:
driver.find_element(By.CSS_SELECTOR, "input[type='file'][accept*='video']")
与XPath相同:
driver.find_element(By.XPATH, "//input[@type='file'][contains(accept,'video')]")
另外,我希望您理解,您需要将上传文件的绝对路径作为字符串发送到此元素,如下所示:
driver.find_element(By.XPATH, "//input[@type='file'][contains(accept,'video')]").send_keys("C:imagesimageupload.exe")
首先,定位器使用了错误的HTML标签。div.jsx2404389384
将定位具有<div>
标签和class=jsx2404389384
的元素。
您想要定位具有<input>
标记的元素,因此
driver.find_element(By.CSS_SELECTOR, 'input.jsx-2404389384')
应该可以工作,假设只有一个<input>
元素具有该类。如果有多个,您需要使用driver.find_elements
,并从<input>
列表中找到正确的class=jsx-2404389384
。
第二,这个类看起来像是自动生成的,或者可能会改变,所以CSS选择器使用属性匹配,比如
driver.find_element(By.CSS_SELECTOR, input[type='file'][accept*='video'])
更好。这将找到type
属性匹配'file'
和accept
属性包含'video'
的标签。
要了解更多信息,Selenium文档链接到一个很棒的CSS选择器资源。如果需要的话,后一个链接将提供更多关于更高级和特定的CSS选择器的信息。还有Mozilla开发人员网络。
元素在iframe中,所以我只需要切换到iframe,然后原始的XPATH, CSS等代码就可以工作了。
无论如何我都很感激你的回答!