【问题标题】:Unable to locate element: org.openqa.selenium.NoSuchElementException无法定位元素:org.openqa.selenium.NoSuchElementException
【发布时间】:2016-04-24 19:58:39
【问题描述】:

我正在编写通过一次性密码 (OTP) 验证手机号码的脚本。当 OTP 弹出窗口打开时,我无法在文本字段中输入值,系统显示错误:

org.openqa.selenium.NoSuchElementException:无法定位元素: {"method":"class name","selector":"opt_success"} 命令持续时间或 超时:30.04 秒”

以下是我起草的代码。

driver.findElement(By.id("phone")).sendKeys(Constants.MOBILE_NUMBER);
        driver.findElement(By.id("btn_verify")).click();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        WebElement otp_value = driver.findElement(By.id("otp"));
        otp_value.sendKeys("1212121212");
        driver.findElement(By.xpath("html/body/div[4]/div/form/div/div[4]/span[1]/input")).click();

网页网址是:http://talentrack.in/register

【问题讨论】:

  • 错误不是来自您的代码。你能告诉我们调用findElement(by.className("opt_success"))的线路吗?
  • 布班是对的。您显示的代码不会导致您显示的错误。你有更多的代码,显示出来。谢谢。

标签: java selenium nosuchelementexception


【解决方案1】:

您需要为“OTP 文本字段”更正 Xpath,如下所示。

driver.findElement(By.xpath("//*[@id='verifyOTP_register']//*[@id='otp']")).sendKeys("1212121212");

此外,您可以对提交按钮使用“相对”xpath,而不是使用“绝对”xpath。

driver.findElement(By.xpath("//*[@id='verifyOTP_register']//*[@type='submit']")).click();

【讨论】:

  • 真的很有帮助,而且运行良好!谢谢斯里坎特
【解决方案2】:
WebElement otp_value = driver.findElement(By.id("otp"));

这是你的问题。页面上有 2 个 id 为“otp”的元素。您正在找到隐藏的第一个,但您需要第二个。

您可以使用 WebDriverWait 来查找可见元素。我在 Python 中这样做是这样的:

element = WebDriverWait(driver, 0).until(EC.presence_of_element_located((By.ID, "otp")))
return element

传递给 WebDriverWait 的超时时间为 0 意味着它只会尝试查找元素一次。您可以创建一个执行此操作的方法并将超时参数传递给它以便于重用。

我确信有一个 Java 等价物。 或者,您可以使用元素独有的不同定位器。

【讨论】:

  • find_visible_element?你确定在 python-selenium 中有这个方法吗? :)
  • @alecxe 你说得对,这是我自己创建的一种方法。我已经修复了答案,但我只是注意到 Buaban 的评论说错误不是显示的代码,他是对的。所以我想这不是正确的答案。
猜你喜欢
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多