我编写了脚本,使用 Selenium Webdriver (Python绑定)发送电子邮件。但有时候,当我运行该脚本时,元素的 ID会发生变化。
错误追溯:
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium-3.4.3-
py2.7.egg/selenium/webdriver/remote/errorhandler.py", line 194, in
check_response
raise exception_class(message, screen, stacktrace)
elenium.common.exceptions.NoSuchElementException: Message: no such
element: Unable to locate element: {"method":"id","selector":":pm"}
有时,如果我使用有效的 XPath 或 CSS 选择器,则会显示相同的错误。
有人能建议让脚本运行的最佳方法吗?另外,为什么每次元素的 Id 都会发生变化?
我的代码:
from selenium import webdriver
import time
from time import sleep
driver = webdriver.Chrome()
driver.get("https://accounts.google.com")
driver.implicitly_wait(30)
usr = driver.find_element_by_id("identifierId").clear()
usr.send_keys("id@anymail.com")
nextb = driver.find_element_by_id("identifierNext")
nextb.click()
pwd = driver.find_element_by_xpath('//*[@id="password"]/div[1]/div/div[1]/input')
pwd.send_keys("**Enter your password**")
nextpwd = driver.find_element_by_xpath('//*[@id="passwordNext"]/content/span')
nextpwd.click()
driver.implicitly_wait(30)
driver.find_element_by_xpath("//*[@id=':hs']/div/div").click()
time.sleep(3)
to = driver.find_element_by_id(":nf")
to.send_keys("XYZ@gmail.com")
sub = driver.find_element_by_id(":my")
sub.send_keys("with attachment")
descp = driver.find_element_by_id(":nx")
descp.send_keys(" Hi! this second one.")
driver.find_element_by_id(":om").click() #attachmment
driver.find_element_by_css_selector("input[type=\"file\"]").send_keys("/home/example.png")
#sead the mail
driver.find_element_by_id(":mo").click()
答案 0 :(得分:3)
你是说Id是动态的吗?这意味着在每个页面上加载元素的id完全或部分地改变。
如果没有静态部分(每次id为100%随机) - 您将无法将其用作定位器,并应使用其他属性/元素来查找所需的属性/元素。与//someParentElement/div[@class='someClass']
类似 - 意味着您可以找到元素的父元素,或使用其他属性,如类/值/等。
如果每次加载时都有静态part
- 您可以使用css或xPath定位器搜索包含/ starts-with static part
的元素。
搜索ID包含part
的元素:
//*[contains(@id,'part')]
- id包含部分xpath定位器
[id*=part]
- id包含部分css定位器
搜索ID以某些part
开头的元素:
开头
//*[starts-with(@id,'part')]
- id以部分xpath定位器开头
[id^=part]
- id以part css locator
答案 1 :(得分:0)
d.findElement(By.xpath("//*[@id='extension-settings-grid']/div/div[4]/div/div/div[3]/div[1]/div/div/div")).click();
//d.findElement(By.className("dx-item-content dx-toolbar-item-content")).click();