Selenium 错误 - 无法定位元素
Selenium error - Unable to locate element
我正在尝试自动化一个购物网站并选择 phone 添加到购物车,但是在更换 ram 时它不断显示无法找到 element.I 已尝试过的相同消息隐式等待和显式等待,但结果相同。我也尝试过使用 JavaScriptexecuter,但同样即将到来。
这是我正在尝试的代码 -
Thread.sleep(5000);
WebElement search = driver.findElement(By.name("q"));
search.sendKeys("mi note10 pro max");
driver.findElement(By.xpath("//[@id=\"container\"]/div/div[1]/div[1]/div[2]/div[2]/form/div/button")).click();
Thread.sleep(5000);
driver.findElement(By.xpath("//[@id=\"container\"]/div/div[3]/div[1]/div[2]/div[9]/div/div/div/a")).click();
Thread.sleep(5000);
WebDriverWait w = new WebDriverWait(driver,20);
WebElement ram = w.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/div[1]/div/div[3]/div[1]/div[2]/div[6]/div/div[3]/div[1]/ul/li[2]")));
//WebElement ram2 = driver.findElement(By.className("_3V2wfe"));
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
js.executeScript("arguments[0].scrollIntoView(true);", ram);
ram.getText();
ram.click();
好的,我可以使用 python selenium 而不是 Java,所以我也这样做了。尽管如此,定位器策略在任何地方都将保持不变。因此,正如@osfresia 提到的,使用长 xpaths 不是一个好习惯。您必须使 xpath 的相对范围尽可能窄。话虽如此,这是我用 Python Selenium 编写的代码。随意拿起 xpath 并解决它。
另外,此时我没有太多时间来获取您所有的代码并进行测试(对我来说,现在只是获取了第一个元素,但它没有为我检测到)。所以我使用了我自己的搜索 - 直接搜索 link 项目,我认为这不会打扰你,因为你正在寻找 RAM 元素,所以你可以从下面的代码中选择它。
driver.get("https://www.flipkart.com/redmi-note-10-pro-max-vintage-bronze-128-gb/p/itmfcdaff39806aa?pid=MOBGF47CJET6F85E&lid=LSTMOBGF47CJET6F85EVCJXV5&marketplace=FLIPKART&q=mi+note+10+pro+max&store=tyy%2F4io&srno=s_1_1&otracker=AS_QueryStore_OrganicAutoSuggest_1_10_na_na_na&otracker1=AS_QueryStore_OrganicAutoSuggest_1_10_na_na_na&fm=SEARCH&iid=ef203add-2f6c-4963-a378-2b6da0fcd440.MOBGF47CJET6F85E.SEARCH&ppt=hp&ppn=homepage&ssid=9qtkzqbc1s0000001641541609979&qH=7b846a424b01e817")
time.sleep(5)
driver.find_element(By.XPATH, "//*[@id='RAM']//parent::div//a[text()='8 GB']").click()
输出:
最初它是 6GB(默认选择),然后它使用上面的代码点击 8GB。
还有一件事,如果您在新的 window 中搜索打开,那么如果需要,您可能必须使用 window 句柄。
我正在尝试自动化一个购物网站并选择 phone 添加到购物车,但是在更换 ram 时它不断显示无法找到 element.I 已尝试过的相同消息隐式等待和显式等待,但结果相同。我也尝试过使用 JavaScriptexecuter,但同样即将到来。
这是我正在尝试的代码 -
Thread.sleep(5000);
WebElement search = driver.findElement(By.name("q"));
search.sendKeys("mi note10 pro max");
driver.findElement(By.xpath("//[@id=\"container\"]/div/div[1]/div[1]/div[2]/div[2]/form/div/button")).click();
Thread.sleep(5000);
driver.findElement(By.xpath("//[@id=\"container\"]/div/div[3]/div[1]/div[2]/div[9]/div/div/div/a")).click();
Thread.sleep(5000);
WebDriverWait w = new WebDriverWait(driver,20);
WebElement ram = w.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/div[1]/div/div[3]/div[1]/div[2]/div[6]/div/div[3]/div[1]/ul/li[2]")));
//WebElement ram2 = driver.findElement(By.className("_3V2wfe"));
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
js.executeScript("arguments[0].scrollIntoView(true);", ram);
ram.getText();
ram.click();
好的,我可以使用 python selenium 而不是 Java,所以我也这样做了。尽管如此,定位器策略在任何地方都将保持不变。因此,正如@osfresia 提到的,使用长 xpaths 不是一个好习惯。您必须使 xpath 的相对范围尽可能窄。话虽如此,这是我用 Python Selenium 编写的代码。随意拿起 xpath 并解决它。 另外,此时我没有太多时间来获取您所有的代码并进行测试(对我来说,现在只是获取了第一个元素,但它没有为我检测到)。所以我使用了我自己的搜索 - 直接搜索 link 项目,我认为这不会打扰你,因为你正在寻找 RAM 元素,所以你可以从下面的代码中选择它。
driver.get("https://www.flipkart.com/redmi-note-10-pro-max-vintage-bronze-128-gb/p/itmfcdaff39806aa?pid=MOBGF47CJET6F85E&lid=LSTMOBGF47CJET6F85EVCJXV5&marketplace=FLIPKART&q=mi+note+10+pro+max&store=tyy%2F4io&srno=s_1_1&otracker=AS_QueryStore_OrganicAutoSuggest_1_10_na_na_na&otracker1=AS_QueryStore_OrganicAutoSuggest_1_10_na_na_na&fm=SEARCH&iid=ef203add-2f6c-4963-a378-2b6da0fcd440.MOBGF47CJET6F85E.SEARCH&ppt=hp&ppn=homepage&ssid=9qtkzqbc1s0000001641541609979&qH=7b846a424b01e817")
time.sleep(5)
driver.find_element(By.XPATH, "//*[@id='RAM']//parent::div//a[text()='8 GB']").click()
输出:
最初它是 6GB(默认选择),然后它使用上面的代码点击 8GB。
还有一件事,如果您在新的 window 中搜索打开,那么如果需要,您可能必须使用 window 句柄。