【问题标题】:Selenium unable to locate xpath even while using time to load page即使使用时间加载页面,Selenium 也无法找到 xpath
【发布时间】:2021-09-22 21:32:34
【问题描述】:

我只想执行一个简单的点击操作。当我启动 webdriver 时,登录页面会出现,我可以通过元素名称找到并传递我的凭据并按 Enter 键,没有任何问题。

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")]

关于单击此按钮我需要做什么的任何想法?

【问题讨论】:

  • 请添加返回的错误。
  • 你能分享到那个页面的链接,或者至少是从正文到那个元素的所有 HTML 代码吗?此外,可能元素属性正在动态变化。
  • @Jortega 抱歉。添加了错误信息
  • @Prophet HTML 代码非常广泛,所以我只发送了包含元素的 div。链接受防火墙保护,因此对您没有任何好处。
  • 我明白了。你确定那里没有 iframe 吗?另外,尝试跟踪该元素的属性值。可能在选择元素等时它们会发生变化。

标签: python-3.x selenium firefox


【解决方案1】:

您可以使用@class 和@id 的组合...类似于:driver.find_element_by_xpath('//*[contains(@id,"id_value") and contains(@class, "class_value")]').click()

【讨论】:

  • 尝试了您的解决方案并得到了 -- 无法找到元素://*[contains(@id,"SM_PF_WRK_SM_PF_SUBACTION") 和 contains(@class, "PSRADIOBUTTON")] -- 可能语法错误?所有标识符都在我原来的 div 帖子中,然后标记为“输入类型”。
  • xpath 在 iframe 中。很难找到,但最终能够找到。感谢您的帮助。
【解决方案2】:

检查那里是否有 iframe。
如果是 - 您必须切换到 iframe 才能访问其中的元素。
并切换到默认内容以访问该 iframe 之外的元素。
请参阅 herehere 或任何其他关于此问题的类似帖子。

【讨论】:

  • 毕竟有一个 iframe。对不起。我想这是一个多余的帖子。
【解决方案3】:

从发布的内容看来,您的代码应该可以工作,所以这只是为了帮助解决问题。

首先让我们尝试使用预期条件。

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()

【讨论】:

  • 感谢您的帮助。原来有一个 iframe。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2021-09-13
  • 2020-08-03
  • 2023-03-06
相关资源
最近更新 更多