J'ai essayé de créer un petit programme pour mettre des articles dans un panier. Il est censé aller sur la page où se trouve l'article et l'ajouter au panier. Ensuite, toutes les informations de facturation seraient saisies en utilisant les données dans une classe Java différente. Chaque fois que j'exécute ce code:
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();
}
}
J'obtiens cette erreur:
Exception in thread "main" org.openqa.Selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"order_billing_name"}
Merci pour l'aide!
Cela me semble être un problème de timing. Après avoir redirigé vers la caisse, vous souhaiterez peut-être attendre les éléments avant d'interagir. Voir Explicit Waits dans la documentation.
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());
vous devez vérifier si cet élément est dans et IFRAME si oui, puis passez d'abord dans iframe et deuxièmement si par ID ne fonctionne pas, utilisez Xpath ou le chemin CSS, pouvez-vous s'il vous plaît partager la source HTML avec moi.