Python/Selenium 识别元素问题
Posted
技术标签:
【中文标题】Python/Selenium 识别元素问题【英文标题】:Python/Selenium Identifying an element issue 【发布时间】:2022-01-22 09:42:51 【问题描述】:我正在尝试使用 python 登录网页,但由于某种原因,无论我尝试什么,我都无法获得正确的登录元素,因为我是菜鸟,这是我的第一次尝试。
这应该是网页中的元素:
<label class="">Username</label>
<input type="text" formcontrolname="username" class="form-control ng-pristine ng-invalid ng-touched xh-highlight">
我试过按标签搜索但没有成功:
username = browser.find_element_by_xpath("//label[contains(text(),'Username')]")
我试过按类别搜索:
username = browser.find_element_by_xpath('//input[@class="form-control ng-pristine ng-invalid ng-touched"]')
我尝试过使用 CssSelector 进行搜索:
username = browser.find_element_by_css_selector("input[formcontrolname='Username']")
我什至尝试过完整的道路:
username = browser.find_element_by_xpath("/html/body/app/div[@class='app-container']/ng-component/div[@class='container']/div[@class='row']/div[@class='col']/div[@class='card']/ng-component/div[@class='card-body']/form[@class='ng-pristine ng-invalid ng-touched']/div[@class='form-group'][1]/input[@class='form-control ng-pristine ng-invalid ng-touched']")
我不知道我做错了什么,请帮忙
【问题讨论】:
Link to image of the source code. 有几个可能的问题。你能分享一个指向那个页面的链接吗? @Prophet link 这个链接不够用。 1)那里可能有 iframe 2)也许你错过了等待等...... 【参考方案1】:要定位 clickable 元素,您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下Locator Strategies 之一:
使用CSS_SELECTOR:
username = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[formcontrolname='username']"))).click()
使用XPATH:
username = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@formcontrolname='username']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
【讨论】:
【参考方案2】:有几个可能的问题:
-
在您尝试访问元素之前,您可能会错过等待/延迟来加载页面。
元素可能位于 iframe 内,因此您必须切换到该 iframe 才能访问其中的元素。
定位器可能不是唯一的。
为了给出更明确的答案,我们需要查看您正在使用的我们页面以及所有相关代码
【讨论】:
以上是关于Python/Selenium 识别元素问题的主要内容,如果未能解决你的问题,请参考以下文章
python selenium webscraping“NoSuchElementException”无法识别