Selenium 即使在使用时间加载页面时也无法定位 xpath
Selenium unable to locate xpath even while using time to load page
我只想执行一个简单的点击操作。当我启动 webdriver 时,登录页面出现,我可以通过元素名称找到并传递我的凭据并按回车键,没有任何问题。
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
driver = webdriver.Firefox(executable_path=r"C:\arcgispro-py3-clone2\Lib\site-packages\selenium\webdriver\firefox\geckodriver.exe")
driver.get("http://server.domain:9999/landing_logon_page)
print(driver.title) # Title of the page
element_userid = driver.find_element_by_name("userid").send_keys("myusername")
element_pwd = driver.find_element_by_name("pwd").send_keys("mypassword")
element_SignIn = driver.find_element_by_name("Submit").click()
# WORKS FINE UP TO HERE
time.sleep(20)
Element = driver.find_element_by_xpath('//*[@id="SM_PF_WRK_SM_PF_SUBACTION"]').click()
无论我对最后一行使用哪种定位方法都不起作用。这包括元素名称、id、css 选择器和 xpath。
div 中的 HTML 包含所需元素的输入类型:
<div id="win1divSM_PF_WRK_SM_PF_SUBACTION">
<input type="radio" name="SM_PF_WRK_SM_PF_SUBACTION" id="SM_PF_WRK_SM_PF_SUBACTION" class="PSRADIOBUTTON" tabindex="285" value="NEW" checked="checked" onclick="setupTimeout2();addchg_win1(this);submitAction_win1(this.form,this.id);">
<label for="SM_PF_WRK_SM_PF_SUBACTION" id="SM_PF_WRK_SM_PF_SUBACTION_LBL" class="PSRADIOBUTTON">New Employee</label>
</div>
这是我收到的错误:
Traceback (most recent call last):
File "<string>", line 22, in <module>
File "C:\arcgispro-py3-clone2\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:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\arcgispro-py3-clone2\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: //*[@id="SM_PF_WRK_SM_PF_SUBACTION"]
还试过包含:
driver.find_element_by_xpath('//*[contains(@id,"SM_PF_WRK_SM_PF_SUBACTION") and contains(@class, "PSRADIOBUTTON")]').click()
并收到此错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\arcgispro-py3-clone2\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:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\arcgispro-py3-clone2\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: //*[contains(@id,"SM_PF_WRK_SM_PF_SUBACTION") and contains(@class, "PSRADIOBUTTON")]
关于单击此按钮需要执行的操作有什么想法吗?
您可以使用@class 和@id 的组合...类似:driver.find_element_by_xpath('//*[contains(@id,"id_value") and contains(@class, "class_value")]').click()
检查那里是否有iframe。
如果是 - 您必须切换到 iframe 才能访问其中的元素。
并切换到默认内容,以便访问该 iframe 之外的元素。
请参阅 here or here 或有关此问题的任何其他类似帖子。
从发布的内容来看,您的代码应该可以正常工作,所以这只是为了帮助解决问题。
首先让我们尝试使用预期的条件。
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
driver = webdriver.Firefox(executable_path=r"C:\arcgispro-py3-clone2\Lib\site-packages\selenium\webdriver\firefox\geckodriver.exe")
driver.get("http://server.domain:9999/landing_logon_page)
print(driver.title) # Title of the page
element_userid = driver.find_element_by_name("userid").send_keys("myusername")
element_pwd = driver.find_element_by_name("pwd").send_keys("mypassword")
element_SignIn = driver.find_element_by_name("Submit").click()
# WORKS FINE UP TO HERE
time.sleep(20)
# Element = driver.find_element_by_xpath('//*[@id="SM_PF_WRK_SM_PF_SUBACTION"]').click()
#########################################################
# TROUBLESHOOTING
#########################################################
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element_list = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.XPATH,"//label[@id='SM_PF_WRK_SM_PF_SUBACTION_LBL']")))
print(len(element_list))
# Expected out put is 1
element_to_click = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//label[@id='SM_PF_WRK_SM_PF_SUBACTION_LBL']")))
element_to_click.click()
########################################
# Also try below if above does not work
########################################
element_to_click2 = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//label[contains(text(), 'New Employee')]")))
element_to_click2.click()
我只想执行一个简单的点击操作。当我启动 webdriver 时,登录页面出现,我可以通过元素名称找到并传递我的凭据并按回车键,没有任何问题。
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
driver = webdriver.Firefox(executable_path=r"C:\arcgispro-py3-clone2\Lib\site-packages\selenium\webdriver\firefox\geckodriver.exe")
driver.get("http://server.domain:9999/landing_logon_page)
print(driver.title) # Title of the page
element_userid = driver.find_element_by_name("userid").send_keys("myusername")
element_pwd = driver.find_element_by_name("pwd").send_keys("mypassword")
element_SignIn = driver.find_element_by_name("Submit").click()
# WORKS FINE UP TO HERE
time.sleep(20)
Element = driver.find_element_by_xpath('//*[@id="SM_PF_WRK_SM_PF_SUBACTION"]').click()
无论我对最后一行使用哪种定位方法都不起作用。这包括元素名称、id、css 选择器和 xpath。
div 中的 HTML 包含所需元素的输入类型:
<div id="win1divSM_PF_WRK_SM_PF_SUBACTION">
<input type="radio" name="SM_PF_WRK_SM_PF_SUBACTION" id="SM_PF_WRK_SM_PF_SUBACTION" class="PSRADIOBUTTON" tabindex="285" value="NEW" checked="checked" onclick="setupTimeout2();addchg_win1(this);submitAction_win1(this.form,this.id);">
<label for="SM_PF_WRK_SM_PF_SUBACTION" id="SM_PF_WRK_SM_PF_SUBACTION_LBL" class="PSRADIOBUTTON">New Employee</label>
</div>
这是我收到的错误:
Traceback (most recent call last):
File "<string>", line 22, in <module>
File "C:\arcgispro-py3-clone2\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:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\arcgispro-py3-clone2\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: //*[@id="SM_PF_WRK_SM_PF_SUBACTION"]
还试过包含:
driver.find_element_by_xpath('//*[contains(@id,"SM_PF_WRK_SM_PF_SUBACTION") and contains(@class, "PSRADIOBUTTON")]').click()
并收到此错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\arcgispro-py3-clone2\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:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\arcgispro-py3-clone2\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\arcgispro-py3-clone2\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: //*[contains(@id,"SM_PF_WRK_SM_PF_SUBACTION") and contains(@class, "PSRADIOBUTTON")]
关于单击此按钮需要执行的操作有什么想法吗?
您可以使用@class 和@id 的组合...类似:driver.find_element_by_xpath('//*[contains(@id,"id_value") and contains(@class, "class_value")]').click()
检查那里是否有iframe。
如果是 - 您必须切换到 iframe 才能访问其中的元素。
并切换到默认内容,以便访问该 iframe 之外的元素。
请参阅 here or here 或有关此问题的任何其他类似帖子。
从发布的内容来看,您的代码应该可以正常工作,所以这只是为了帮助解决问题。
首先让我们尝试使用预期的条件。
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
driver = webdriver.Firefox(executable_path=r"C:\arcgispro-py3-clone2\Lib\site-packages\selenium\webdriver\firefox\geckodriver.exe")
driver.get("http://server.domain:9999/landing_logon_page)
print(driver.title) # Title of the page
element_userid = driver.find_element_by_name("userid").send_keys("myusername")
element_pwd = driver.find_element_by_name("pwd").send_keys("mypassword")
element_SignIn = driver.find_element_by_name("Submit").click()
# WORKS FINE UP TO HERE
time.sleep(20)
# Element = driver.find_element_by_xpath('//*[@id="SM_PF_WRK_SM_PF_SUBACTION"]').click()
#########################################################
# TROUBLESHOOTING
#########################################################
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element_list = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.XPATH,"//label[@id='SM_PF_WRK_SM_PF_SUBACTION_LBL']")))
print(len(element_list))
# Expected out put is 1
element_to_click = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//label[@id='SM_PF_WRK_SM_PF_SUBACTION_LBL']")))
element_to_click.click()
########################################
# Also try below if above does not work
########################################
element_to_click2 = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//label[contains(text(), 'New Employee')]")))
element_to_click2.click()