Selenium Python NoSuchElementException:消息:没有这样的元素:无法找到元素:

时间:2018-12-15 15:01:02

标签: javascript python html css selenium

背景

因此,我对编码的知识很少,我尝试通过指南和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语句,try和其他所有内容。

解决方案:

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

  2. 我尝试摆弄iframe命令,但我不相信第一个按钮在不同的iframe上,但是第二个按钮也许是。

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

HTML:

IMAGE OF SETTINGS PAGE

上面是设置页面的图像,我要单击红色圆圈中的按钮

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

认为元素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]')

2 个答案:

答案 0 :(得分:0)

api.setColumnDefs似乎是动态的,请尝试使用以下Xpath

ID

点击# 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] 按钮后,您需要等待直到表格弹出窗口出现

答案 1 :(得分:0)

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

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

我设法通过键入自己的xpath来解决此问题,并提出了以下建议:

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

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

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

每次运行程序时这些工作!