【问题标题】:Selenium driven browser shows different HTML codeSelenium 驱动的浏览器显示不同的 HTML 代码
【发布时间】:2020-12-06 10:50:50
【问题描述】:

我不是一个非常有经验的编码员,如果我说愚蠢的话,我深表歉意。

我正在使用 Python(在 Spyder 中)让 Selenium 填写包含用户名和密码的网站表单。这是目标 - link

当我在常规浏览器中按 F12 查找“用户名”元素时,我得到以下信息:

<input class="slds-input input" type="text" aria-describedby="" placeholder="Username" id="172:0" data-aura-rendered-by="176:0" data-interactive-lib-uid="2">

所以我尝试使用 ID 定位元素。但是,当我运行脚本时,我在 Chrome 中收到以下错误:

NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"[id="172:0"]"}

当我在 Firefox 中运行它时也是这样:

NoSuchElementException: Unable to locate element: [id="172:0"]

当我在 Selenium 驱动的浏览器中查看 HTML 时,我可以看到页面代码(即元素 ID)不同,如下所示

<input class="slds-input input" type="text" aria-describedby="" placeholder="Username" id="78:2;a" data-aura-rendered-by="82:2;a" data-interactive-lib-uid="2">

我最好的猜测是 HTML 代码的差异是错误的原因。我发现人们发布了类似的问题,但略有不同,我无法使用那里提出的解决方案来解决我的问题。如果有人可以帮助我处理我的案子,我将不胜感激。

【问题讨论】:

  • 对链接的访问是私有的吗?如果可能,请将其添加到问题中,以便可以重现,以便更容易为您提供帮助。
  • @Fake,谢谢 - 添加了链接!
  • @Nam 参考更新后的答案

标签: python selenium


【解决方案1】:

使用 xpath 而不是 id,因为它会动态变化

用户名的 Xpath://label/following-sibling::input

密码的 Xpath://lightning-input//div//input

在java中工作的示例工作代码在python中使用上面的xpath进行转换,并在启动网站之前添加implicitlyWaitpageLoadTimeout

        WebDriver driver = new ChromeDriver();      
        driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://lta-tennis.force.com/"); // WebElement
        driver.findElement(By.xpath("//label/following-sibling::input")).sendKeys("dummy");
        driver.findElement(By.xpath("//lightning-input//div//input")).sendKeys("dummy");
        System.out.println(driver.getTitle());

编辑 1:基于 OP 评论 这是工作xpath

【讨论】:

  • 不幸的是,它对我不起作用。我运行了以下命令: username_field = driver.find_element_by_xpath("//label/following-sibling::input") username_field.sendKeys("dummy") 这给出了一个错误:“NoSuchElementException: Unable to locate element: //label/跟随兄弟::输入"
  • @Nam 参考更新的答案它正在工作 xpath 也适用于我。你应该添加隐式等待。添加您在问题中尝试过的代码,以便帮助我们解决问题
  • 哦,请问您是如何计算出 XPath 的?右键单击 -> 复制 XPath 给出了完全不同的结果。
  • 使用工具和扩展是没有用的。自己掌握。学习this
【解决方案2】:

试试这些 xpaths

//input[@placeholder="Username"]
//input[@placeholder="Password"]

这是完整的代码

from selenium import webdriver
import time
browser = webdriver.Chrome('C:\\driverpath\\chromedriver.exe')
url = 'https://lta-tennis.force.com/s/login/'
get = browser.get(url)
time.sleep(5)
browser.find_element_by_xpath('//input[@placeholder="Username"]').send_keys('hello')
browser.find_element_by_xpath('//input[@placeholder="Password"]').send_keys('pass')

【讨论】:

  • 谢谢!该解决方案也有效!没有“等待”是主要问题!
  • 您好,请问您使用什么工具来计算 xpath?
  • @Nam 我没有使用任何工具来计算 Xpath,我们需要了解语法并找出元素的“独特而简单”的 xpath 以获得更好的结果
  • 我想我需要更好地教育自己。谢谢!
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多