【问题标题】:Why every time in Selenium Webdriver the “ID” of any web element gets changed?为什么每次在 Selenium Webdriver 中任何 Web 元素的“ID”都会改变?
【发布时间】:2017-12-11 12:57:21
【问题描述】:

我编写了一个脚本,它使用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"}

有时,如果我使用有效的 XPathCSS Selector,则会显示相同的错误。

任何人都可以建议使脚本正常工作的最佳方法吗?还有,为什么每次元素的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()

【问题讨论】:

  • 建议始终分享您正在使用的页面的代码和html,以便有人可以帮助您
  • 没错,请分享您的代码和页面的html。可以使用其他定位器属性以及使用 xpath 函数轻松捕获动态 id。因此,如果您可以共享页面的 html,那就太好了。谢谢!
  • Shivangi,我建议您单击 edit 并添加包含您要查找的元素的 HTML 部分。也添加脚本代码。否则,你会得到糟糕的、模糊的答案。
  • 谢谢大家的建议

标签: python css selenium xpath selenium-webdriver


【解决方案1】:

您的意思是 Id 是动态的?这意味着在每个页面加载元素的 id 全部或部分更改。

如果没有静态部分(每次 id 都是 100% 随机的) - 您将无法将其用作定位器,而应使用其他属性/元素来查找所需的。像//someParentElement/div[@class='someClass'] - 意味着你可以找到元素的父元素,或者使用额外的属性,比如类/值/等。

如果每次加载时都有静态 part - 您可以使用 css 或 xPath 定位器来搜索包含/以静态 part 开头的元素。

搜索 id 包含一些 part 的元素:

//*[contains(@id,'part')] - id 包含部分 xpath 定位器

[id*=part] - id 包含部分 css 定位器

搜索id以part开头的元素:

//*[starts-with(@id,'part')] - id 以部分 xpath 定位器开头

[id^=part] - id 以部分 css 定位器开头

【讨论】:

    【解决方案2】:
    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();
    

    【讨论】:

    • 请添加解释如何回答原始问题。
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多