Selenium Web Driver无法找到元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium Web Driver无法找到元素相关的知识,希望对你有一定的参考价值。

我一直在尝试创建一个小项目,将项目放入购物车。它应该进入项目所在的页面并将其添加到购物车。然后,通过使用不同java类中的数据来输入所有计费信息。每次我运行这段代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;



public class Supreme {

    public static void main(String[] args) throws Exception{
        long start = System.nanoTime();
        WebDriver driver = new FirefoxDriver();

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        driver.get("http://www.supremenewyork.com/shop/hats/selassie-beanie/grey");
        WebElement add = driver.findElement(By.name("commit"));
        add.click();

        driver.get("https://www.supremenewyork.com/checkout");

        AccountInfo a = new AccountInfo();
        a = a.getAccount();

        WebElement name = driver.findElement(By.id("order_billing_name"));
        name.sendKeys(a.getName());

        WebElement email = driver.findElement(By.id("order_email"));
        email.sendKeys(a.getEmail());

        WebElement phone = driver.findElement(By.id("order_tel"));
        phone.sendKeys(a.getPhone());

        WebElement address1 = driver.findElement(By.id("order_billing_address"));
        address1.sendKeys(a.getAddress1());

        WebElement address2 = driver.findElement(By.id("order_billing_address_2"));
        address2.sendKeys(a.getAddress2());

        WebElement city = driver.findElement(By.id("order_billing_city"));
        city.sendKeys(a.getCity());

        WebElement zip = driver.findElement(By.id("order_billing_zip"));
        zip.sendKeys(a.getZip());

        Select state = new Select(driver.findElement(By.id("order_billing_state")));
        state.selectByVisibleText(a.getState());

        Select type = new Select(driver.findElement(By.id("credit_card_type")));
        type.selectByVisibleText(a.getType());

        WebElement credit = driver.findElement(By.id("credit_card_number"));
        credit.sendKeys(a.getCredit());

        Select creditmonth = new Select(driver.findElement(By.id("credit_card_month")));
        creditmonth.selectByVisibleText(a.getExpMonth());

        Select credityear = new Select(driver.findElement(By.id("credit_card_year")));
        credityear.selectByVisibleText(a.getExpYear());

        WebElement cvv = driver.findElement(By.id("credit_card_verification_value"));
        cvv.sendKeys(a.getCVV());

        List<WebElement> check = driver.findElements(By.className("iCheck-helper"));
        for(WebElement w : check){
            w.click();
        }

        WebElement process = driver.findElement(By.name("commit"));
        process.click();
    }
}

我收到此错误:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"order_billing_name"}

谢谢您的帮助!

答案

看起来像是时间问题。重定向到结帐后,您可能希望在交互之前等待元素。请参阅文档中的Explicit Waits

WebDriverWait wait = new WebDriverWait(driver, 60);// 1 minute 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("order_billing_name")));
driver.findElement(By.id("order_billing_name")).sendKeys(a.getName());
另一答案

你必须检查是否有这个元素和IFRAME如果是,那么首先切换到iframe,其次如果ID不工作那么使用Xpath或CSS路径,请你与我分享html源代码。

以上是关于Selenium Web Driver无法找到元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Web-Driver 找不到元素(Selenium IDE 确实找到了它)

Selenium Web Driver _ 如何识别画布地图中的 Web 元素

了解Selenium的WebDriverException,“无法找到元素”

Selenium无法找到一个类

Selenium:常见web UI元素操作及API使用

java selenium 常见web UI 元素操作 及API使用