背景:
因此,我对编码的知识很少,我尝试通过指南和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和其他所有内容。
解决方案:
我试图让浏览器等待元素加载。
我尝试摆弄iframe命令,但我不相信第一个按钮在不同的iframe上,但是第二个按钮也许是。
我尝试使用xpath,也尝试使用CSS选择器命令。
HTML:
上面是设置页面的图像,我要单击红色圆圈中的按钮
这是xpath://*[@id="ember815"]/div[3]/div[2]/button
认为元素100%存在。
有一个元素检查的屏幕截图。
单击按钮后,将显示此框,然后我需要填写这些字段。
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()
它已经完成了程序,所以将我带到了这个阶段。
现在我在填写表格时遇到了同样的问题。
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]')
答案 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"]
每次运行程序时这些工作!