NoSuchElementException:消息:尝试通过 Selenium 和 Python 单击按钮 VISA 时无法定位元素
NoSuchElementException: Message: Unable to locate element while trying to click on the button VISA through Selenium and Python
我无法单击此按钮在我的机器人上创建结帐。
我想点击图片进入另一个页面。
<label for="VISA" class="choiceLabel">
<input type="radio" class="visuallyhidden" name="cardTypeRadio" id="VISA" value="VISA" title="VISA" onclick="validateAndSubmit('VISA');">
<span class="imgElt xh-highlight" onclick="validateAndSubmit('VISA');">
<img src="/static/2.15.0.1/images/type-carte/visa.png" alt="VISA" title="Visa">
</span>
<span class="txtElt">Visa</span>
</label>
这是我的代码:
try:
check = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID,"VISA" )))
print ("Page is ready!")
visa = driver.find_elements_by_xpath("label[@class='choiceLabel'][4]")
visa.click()
except TimeoutException:
print ("Loading took too much time!")
return check
我收到此错误:
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "c:/Users/pietro/Documents/monitor/x/bot.py", line 48, in all
visa = driver.find_element_by_xpath("label[@class='choiceLabel'][4]")
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: label[@class='choiceLabel'][4]
您正在搜索的 xPath 可能看起来更像这样:
//input[@name='cardTypeRadio' and @value='VISA']
如果这不能为您提供独特的元素,我们可以对其进行一些改进。
可能你的 xpath
是 wrong.Try 下面这个 code.Hope 这有帮助。
driver.find_element_by_xpath("//input[@name='cardTypeRadio']").click()
或
driver.find_element_by_xpath("//input[@id='VISA']").click()
如果webdriver
点击不work.TryJavaScript点击。
driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("//input[@name='cardTypeRadio']"))
driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("//input[@id='VISA']"))
在我的机器人上创建结帐的 按钮 似乎是一个 信用卡 相关字段并且历史上 信用Card 相关字段位于 <iframe>
.
内
您可以在以下位置找到一些相关讨论:
因此,如果所需元素在 <iframe>
内,那么您必须:
- 诱导 WebDriverWait 以获得所需的 框架并切换到它.
- 诱导 WebDriverWait 使所需的 元素可点击。
您可以使用以下任一解决方案:
使用CSS_SELECTOR
:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe_css_selector")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='VISA']"))).click()
使用XPATH
:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe_xpath")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='VISA']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
我无法单击此按钮在我的机器人上创建结帐。 我想点击图片进入另一个页面。
<label for="VISA" class="choiceLabel">
<input type="radio" class="visuallyhidden" name="cardTypeRadio" id="VISA" value="VISA" title="VISA" onclick="validateAndSubmit('VISA');">
<span class="imgElt xh-highlight" onclick="validateAndSubmit('VISA');">
<img src="/static/2.15.0.1/images/type-carte/visa.png" alt="VISA" title="Visa">
</span>
<span class="txtElt">Visa</span>
</label>
try:
check = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID,"VISA" )))
print ("Page is ready!")
visa = driver.find_elements_by_xpath("label[@class='choiceLabel'][4]")
visa.click()
except TimeoutException:
print ("Loading took too much time!")
return check
我收到此错误:
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "c:/Users/pietro/Documents/monitor/x/bot.py", line 48, in all
visa = driver.find_element_by_xpath("label[@class='choiceLabel'][4]")
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: label[@class='choiceLabel'][4]
您正在搜索的 xPath 可能看起来更像这样:
//input[@name='cardTypeRadio' and @value='VISA']
如果这不能为您提供独特的元素,我们可以对其进行一些改进。
可能你的 xpath
是 wrong.Try 下面这个 code.Hope 这有帮助。
driver.find_element_by_xpath("//input[@name='cardTypeRadio']").click()
或
driver.find_element_by_xpath("//input[@id='VISA']").click()
如果webdriver
点击不work.TryJavaScript点击。
driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("//input[@name='cardTypeRadio']"))
driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("//input[@id='VISA']"))
在我的机器人上创建结帐的 按钮 似乎是一个 信用卡 相关字段并且历史上 信用Card 相关字段位于 <iframe>
.
您可以在以下位置找到一些相关讨论:
因此,如果所需元素在 <iframe>
内,那么您必须:
- 诱导 WebDriverWait 以获得所需的 框架并切换到它.
- 诱导 WebDriverWait 使所需的 元素可点击。
您可以使用以下任一解决方案:
使用
CSS_SELECTOR
:WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe_css_selector"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='VISA']"))).click()
使用
XPATH
:WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe_xpath"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='VISA']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC