【问题标题】:Selenium error - Unable to locate elementSelenium 错误 - 无法定位元素
【发布时间】:2022-01-06 14:47:31
【问题描述】:

我正在尝试使购物网站自动化并选择要添加到购物车中的手机,但是在更改 ram 时,它不断显示相同的消息,即无法找到该元素。我尝试过隐式等待和显式等待,但是结果是一样的。我也尝试过使用 JavaScriptexecute,但同样的情况即将到来。

这是我正在尝试的代码 -

    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();

【问题讨论】:

  • 我注意到的第一件事是您使用带有很多 div 的 xPath。这可以工作,但仅适用于静态页面,每次页面重新加载或更新时,div 的架构可能会有所不同,这可能是您的情况。我强烈建议您更改通知 selenium 您要搜索的对象的等待时间,例如使用TagName 财产。
  • @Kumar 请提供网站链接,以便调查
  • @AnandGautam 检查 Flipkart 并尝试检查,如果您得到结果,请告诉我。

标签: selenium selenium-webdriver automated-tests ui-automation


【解决方案1】:

好的,我可以使用 python selenium 而不是 Java,所以我也这样做了。尽管如此,定位器策略在任何地方都将保持不变。因此,正如@osfresia 所提到的,使用长 xpath 并不是一个好习惯。您必须尽可能保持 xpath 的相对范围狭窄。话虽如此,这是我用 Python Selenium 编写的代码。随意拿起 xpath 并解决它。 另外,此时我没有太多时间来获取您的所有代码并进行测试(现在,我只使用了第一个元素,它没有为我检测到)。所以我使用了我自己的搜索 - 项目的直接搜索链接,我认为在您寻找 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。

还有一点,如果您在新窗口中搜索打开,那么您可能必须在需要时使用窗口句柄。

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2022-01-06
    • 2021-06-21
    • 1970-01-01
    • 2017-11-27
    • 2018-07-06
    相关资源
    最近更新 更多