无法找到元素:org.openqa.selenium.NoSuchElementException

无法找到元素:org.openqa.selenium.NoSuchElementException

问题描述:

我正在通过一次性密码(OTP)编写用于手机号码验证的脚本。虽然OTP弹出是开放的,我不能把值在文本字段中,系统显示错误:无法找到元素:org.openqa.selenium.NoSuchElementException

org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"class name","selector":"opt_success"} Command duration or timeout: 30.04 seconds"

下面是我起草的代码。

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

+2

错误不是来自您的代码有问题。你能告诉我们调用'findElement(by.className(“opt_success”))''的行吗? – Buaban

+0

Buaban是对的。您显示的代码不会导致您显示的错误。有更多的代码,显示它。谢谢。 – alecxe

You need to correct your Xpath for "OTP text field" as below.

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

此外,您还可以使用 '相对' 的XPath提交的,而不是用 '绝对' 的XPath按钮。

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

真的有用,它工作正常!感谢Srikanth –

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的等价物。 或者,您可以使用元素所特有的不同定位器。

+1

'find_visible_element'?你确定在python-selenium中有这种方法吗? :) – alecxe

+0

@alecxe你说得对,那是我自己创造的一种方法。我已经解决了答案,但我只注意到Buaban的评论说错误不是显示的代码,他是正确的。所以我想这不是正确的答案。 – RemcoW