为什么每次在Selenium Webdriver中任何web元素的“ID”都会被更改?

时间:2017-07-07 09:23:56

标签: python css selenium xpath selenium-webdriver

我编写了脚本,使用 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()

2 个答案:

答案 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();