【问题标题】:Selenium Python NoSuchElementException: Message: no such element: Unable to locate element:Selenium Python NoSuchElementException:消息:没有这样的元素:无法找到元素:
【发布时间】:2018-12-15 15:01:01
【问题描述】:

背景:

所以我的编码知识很少,我曾多次尝试通过指南和 youtube 教程学习编码,但在我的学习中从未走得很远。这一次,我正在尝试一种不同的方法,简单地有一个想法并去做。

我正在尝试使程序与网站fitbit 进行交互。很简单,它需要登录并更改我帐户的电子邮件。

我已成功使用 Selenium python 登录并访问设置页面,但我无法与除此之外的任何元素进行交互。

程序进入设置页面后,需要单击“更改电子邮件地址”

然后填写表格并点击提交。这就是我需要程序做的所有事情。

我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


chromedriver = webdriver.Chrome(executable_path=r'C:/Utility/BrowserDrivers/chromedriver.exe')
browser = chromedriver


browser.get('https://www.fitbit.com/settings/profile')
browser.implicitly_wait(20)
username = browser.find_element_by_xpath('//*[@id="loginForm"]/fieldset/dl/dd[1]/input')
username.click()
username.send_keys('Email')
password = browser.find_element_by_xpath('//*[@id="loginForm"]/fieldset/dl/dd[2]/input')
password.click()
password.send_keys('Password')

browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/button').click()
browser.implicitly_wait(30)
#browser.find_element_by_xpath('//*[@id="ember798"]/div[3]/div[2]/button').click()
new_email = browser.find_element_by_xpath('//*[@id="ember1077"]')
new_email.click()
new_email.send_keys('New Email')
confirm_new_email = browser.find_element_by_xpath('//*[@id="ember1107"]')
confirm_new_email.click()
confirm_new_email.send_keys('New Email')
password = browser.find_element_by_xpath('//*[@id="ember1119"]')
password.click()
password.send_keys('Password')
#browser.find_element_by_css_selector('#ember832 > div:nth-child(4) > div.column.medium-5.change-email-button-container > button').click()
#browser.find_element_by_xpath('//*[@id="ember748"]/div[3]/div[2]').click()

我的错误:

DevTools listening on ws://127.0.0.1:51658/devtools/browser/12ae1773-a1f7-473f-8128-32f2090202fc
[12820:7500:1215/095935.812:ERROR:shader_disk_cache.cc(257)] Failed to create shader cache entry: -2
[12820:7500:1215/095959.060:ERROR:shader_disk_cache.cc(257)] Failed to create shader cache entry: -2
Traceback (most recent call last):
  File "looptest.py", line 25, in <module>
    new_email = browser.find_element_by_xpath('//*[@id="ember1077"]')
  File "C:\Python36\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:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']

  File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_resp
onse
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"
method":"xpath","selector":"//*[@id="ember1077"]"}
  (Session info: chrome=70.0.3538.110)
  (Driver info: chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform=Windows NT 1
0.0.17134 x86_64)

我很欣赏代码是杂乱无章的,我计划在程序实际运行后整理并添加 if 语句、尝试和其他所有内容。

解决方案:

  1. 我已尝试让浏览器等待元素加载。

  2. 我试过摆弄 iframe 命令,我不相信第一个按钮在不同的 iframe 上,但第二部分可能。

  3. 我尝试过使用 xpath,也尝试过使用 CSS 选择器命令。

HTML:

IMAGE OF SETTINGS PAGE

上面是设置页面的图片,我要点击红圈的按钮

这里是 xpath://*[@id="ember815"]/div[3]/div[2]/button

sol 元素 100% 存在。

HTML OF BUTTON

有一个元素检查的屏幕截图。

CHANGE EMAIL FIELDS

单击按钮后,将出现此框,然后我需要填写这些字段。

THE HTML OF THE NEW EMAIL FIELD

对此的任何帮助将不胜感激。我知道这个页面上有相当多的 Javascript,我认为这是我的问题。 Javascript 正在制作它,所以我无法与这些元素交互,但我不确定为什么。

更新 1.0

一位用户建议我截取所有我不确定是否要使用该命令的部分

browser.save_screenshot('error2.png')

有趣的是,屏幕截图是空白的。 SEE IMAGE

更新 2.0

感谢您到目前为止的回复,我已经实施了这个建议。

我实现了这行代码

browser.find_element_by_xpath('//button[@class="button change-email-button"]').click()

它已经推进了程序,所以它把我带到了这个阶段。

Here

现在我在填写表格时遇到了同样的问题。

Traceback (most recent call last):
  File "looptest.py", line 28, in <module>
    new_email = browser.find_element_by_xpath('(//input[@data-test-qa="new-email"])[2]')
  File "C:\Python36\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:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element

    'value': value})['value']
  File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_resp
onse
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"
method":"xpath","selector":"(//input[@data-test-qa="new-email"])[2]"}
  (Session info: chrome=70.0.3538.110)
  (Driver info: chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform=Windows NT 1
0.0.17134 x86_64)

我添加了等待和其他东西,但仍然没有运气

browser.find_element_by_xpath('//button[@class="button change-email-button"]').click()
browser.implicitly_wait(30)
#new_email = browser.find_element_by_xpath('//*[@id="ember1077"]')
new_email = browser.find_element_by_xpath('(//input[@data-test-qa="new-email"])[2]')

【问题讨论】:

  • 您应该尝试在您不确定的每个步骤中截屏。
  • 我提供的截图不够吗?
  • 对不起,我只是建议您如何更好地调试它。我不想回答这个问题。
  • 哦,很好!感觉截图已经够多了。但我们会看看其他人是否能够提供帮助!
  • 我说的是this,而不是你分享的网站截图。

标签: javascript python html css selenium


【解决方案1】:

似乎ID 是动态的尝试使用以下 Xpath

# Change Email Address button
//button[@class="button change-email-button"]

# email
(//input[@data-test-qa="new-email"])[2]

# confirm email
(//input[@data-test-qa="confirm-new-email"])[2]

# password
(//input[@data-test-qa="password-for-email-change"])[2]

点击Change Email按钮后,你需要等到弹出窗体

【讨论】:

  • 感谢您的建议。现在尝试。为什么浏览器截取的屏幕截图看起来是空白的?查看更新!
  • 对于截图尝试使用完整路径或browser.get_screenshot_as_file('D:/error2.png')
  • 您的建议部分有效。它打开了更改电子邮件窗口,但我在电子邮件、确认电子邮件和密码方面遇到了同样的问题。
  • 我在上面告诉你需要等到表格出现。
  • @NiallMcGibney 在继续登录调用之前尝试休眠或等待表单中的元素出现
【解决方案2】:

感谢回复的用户。我们有解决方案

正如@ewwink 正确所说,这里的关键事实是,我没有注意到我试图访问的元素具有动态 ID。

我通过输入我自己的 xpath 设法解决了这个问题,并想出了以下内容:

//*[@data-test-qa="new-email"]

//*[@data-test-qa="confirm-new-email"]

//*[@data-test-qa="password-for-email-change"]

每次程序运行时这些都会起作用!

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多