无法定位元素:通过 Selenium 和 Python 单击按钮时
Unable to locate element: while clicking a button through Selenium and Python
我想在 Python 上使用 Selenium 单击一个按钮(事件),按钮代码是:
<input id="workbenchLst:j_id_id509" name="workbenchLst:j_id_id509" onclick="A4J.AJAX.Submit('workbenchLst',event,{'similarityGroupingId':'workbenchLst:j_id_id509','parameters':{'ajaxSingle':'workbenchLst:j_id_id509','workbenchLst:j_id_id509':'workbenchLst:j_id_id509'} ,'containerId':'j_id_id1'} );return false;" value="Add" type="button" autocomplete="off">
我的代码:
driver.find_element_by_id("workbenchLst:j_id_id509").click()#add
它不工作,错误:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [name="workbenchLst:j_id_id509"]
所需的元素是一个动态元素,因此要找到您必须诱导 WebDriverWait 的元素才能使 元素可点击 并且您可以使用以下任一解决方案:
使用CSS_SELECTOR
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id^='workbenchLst:'][name^='workbenchLst:'][value='Add']"))).click()
使用XPATH
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[starts-with(@id,'workbenchLst:') and starts-with(@name,'workbenchLst:')][@value='Add']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
首先检查您页面中的iframe/frame,如果有frame/iframe,那么您需要先切换框架,如下所示:
driver.switch_to_frame(driver.find_element_by_id("iframeid"));
您可以尝试使用以下 XPath 单击元素:
element = driver.find_element_by_xpath("//input[contains(@id, 'workbenchLst') and @value='Add']");
element.click();
或者您可以尝试使用 JavaScript 执行器,如下所示:
element = driver.find_element_by_xpath("//input[contains(@id, 'workbenchLst') and @value='Add']");
driver.execute_script("arguments[0].click();", element);
仍然不工作然后尝试给一些延迟,从如下时间导入睡眠:
from time import sleep
driver.switch_to_frame(driver.find_element_by_id("iframeid"));
sleep(5);
element = driver.find_element_by_xpath("(//input[contains(@id, 'workbenchLst') and @value='Add'])[2]");
element.click();
希望有用...
我想在 Python 上使用 Selenium 单击一个按钮(事件),按钮代码是:
<input id="workbenchLst:j_id_id509" name="workbenchLst:j_id_id509" onclick="A4J.AJAX.Submit('workbenchLst',event,{'similarityGroupingId':'workbenchLst:j_id_id509','parameters':{'ajaxSingle':'workbenchLst:j_id_id509','workbenchLst:j_id_id509':'workbenchLst:j_id_id509'} ,'containerId':'j_id_id1'} );return false;" value="Add" type="button" autocomplete="off">
我的代码:
driver.find_element_by_id("workbenchLst:j_id_id509").click()#add
它不工作,错误:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [name="workbenchLst:j_id_id509"]
所需的元素是一个动态元素,因此要找到您必须诱导 WebDriverWait 的元素才能使 元素可点击 并且您可以使用以下任一解决方案:
使用
CSS_SELECTOR
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id^='workbenchLst:'][name^='workbenchLst:'][value='Add']"))).click()
使用
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[starts-with(@id,'workbenchLst:') and starts-with(@name,'workbenchLst:')][@value='Add']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
首先检查您页面中的iframe/frame,如果有frame/iframe,那么您需要先切换框架,如下所示:
driver.switch_to_frame(driver.find_element_by_id("iframeid"));
您可以尝试使用以下 XPath 单击元素:
element = driver.find_element_by_xpath("//input[contains(@id, 'workbenchLst') and @value='Add']");
element.click();
或者您可以尝试使用 JavaScript 执行器,如下所示:
element = driver.find_element_by_xpath("//input[contains(@id, 'workbenchLst') and @value='Add']");
driver.execute_script("arguments[0].click();", element);
仍然不工作然后尝试给一些延迟,从如下时间导入睡眠:
from time import sleep
driver.switch_to_frame(driver.find_element_by_id("iframeid"));
sleep(5);
element = driver.find_element_by_xpath("(//input[contains(@id, 'workbenchLst') and @value='Add'])[2]");
element.click();
希望有用...