【问题标题】:driver.get(URL), driver.navigate().to(URL), and driver.navigate().back() not workingdriver.get(URL)、driver.navigate().to(URL) 和 driver.navigate().back() 不工作
【发布时间】:2020-09-05 00:07:03
【问题描述】:

我正在尝试获取此亚马逊页面 (https://www.amazon.com/s?rh=n%3A565108%2Cp_72%3A4-&pf_rd_i=565108&pf_rd_p=b2e34a42-7eb2-50c2-8561-292e13c797df&pf_rd_r=E87FK4Z32CV7VPR4EZGP&pf_rd_s=merchandised-search-11&pf_rd_t=BROWSE&ref=Oct_s9_apbd_otopr_hd_bw_b2N0e_S) 中列出的每台笔记本电脑的图片 URL。

该方法应该点击每个正在销售的列表,使用 driver.findElement(By.xpath(namesXpath)).getAttribute("src") 获取图像 URL 并将其保存到 URL 列表中。 .但是,当我尝试让驱动程序返回到充满所有笔记本电脑列表的页面以便它可以继续通过 for 循环并获取其他列表的图像时,它给了我下面的错误。我已经尝试过 driver.get(URL)、driver.navigate().to(URL) 和 driver.navigate().back(),但它们都无法将我带回上一页。

奇怪的是,在我的主要方法中, driver.get("https://amazon.com") 工作正常, driver.findElement(by.xpath).click() 也工作正常。它只是在这种方法中中断。

我是 s=java 和 selenium 的新手,所以我希望这一切都有意义。任何帮助,将不胜感激。如果您需要更多说明,请告诉我

Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//img [@id="detailImg"]"}
  (Session info: chrome=81.0.4044.138)
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:48'
System info: host: 'DESKTOP-AU2FJQL', ip: '192.168.0.245', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_251'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 81.0.4044.138, chrome: {chromedriverVersion: 81.0.4044.69 (6813546031a4b..., userDataDir: C:\Users\email\AppData\Loca...}, goog:chromeOptions: {debuggerAddress: localhost:50907}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:virtualAuthenticators: true}
Session ID: 1fe48e105aae883db4215eba6bb8c06b
*** Element info: {Using=xpath, value=//img [@id="detailImg"]}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at Executer.picsUpdateList(Executer.java:363)
    at Executer.main(Executer.java:163) 
public static String namesXpath = "//span[@data-a-strike=\"true\" or contains(@class,\"text-strike\")][.//text()]/preceding::span[@class][10]";

public static void picsUpdateList(WebDriver driver, List<String> URLs, List<BufferedImage> pics) throws IOException, InterruptedException
    {
        //list of deals on amazon page
        List<WebElement> deals = driver.findElements(By.xpath(namesXpath));

        //URL of each picture saved since this method was called
        List<String> freshURLs = new ArrayList<String>();

        //saves the URL of the page with all listings
        String pageURL = driver.getCurrentUrl();
        System.out.println(pageURL);

        //1. clicks on each deal from List<> deals
        //2. Grabs picture by xpath and saves the URL to both lists
        //3. 
        for(WebElement deal : deals)
        {
            deal.click();
            System.out.println("clicked on next deal");
            Thread.sleep(time);
            String url = driver.findElement(By.xpath("//img [@id=\"detailImg\"]")).getAttribute("src");
            URLs.add(url);
            freshURLs.add(url);
            System.out.println(url);
/// ERROR HERE//////////////////////////
            driver.navigate().back();
//////////////////////////////////////////
            System.out.println("back to page");
            Thread.sleep(time);
        }

        for(String url : freshURLs)
        {
            pics.add(ImageIO.read(new URL(url)));
        }

    }

【问题讨论】:

  • 你好。只是想问一下,您是否能够看到代码实际上确实获得了第一笔交易的 img src url?它是否在控制台/终端上打印出来(通过此代码 System.out.println(url))?这样您提供的错误不是指向返回上一页,而是在图像 src 上找不到。我尝试在线查看亚马逊交易示例,似乎您可能需要先将鼠标悬停在图像上,然后在页面的 html 正文中提供 @id="detailImg"。所以只想知道错误确实是在导航中还是在获取图像源时。

标签: java selenium webdriver selenium-chromedriver


【解决方案1】:

我想建议使用@id="landingImage" 而不是@id="detailImg"。 然后获取data-old-hires字段值获取url。这与您从@id="detailImg" 获得的源网址相同(但正如我之前的评论中提到的,您可能需要先将鼠标悬停在屏幕上的图像上,然后才能弹出该元素,我认为这是原因错误)。

您可以先尝试您的代码,如果这能解决您的问题,请告诉我们。

这是点击您提供的亚马逊页面网址的交易示例。 我已经用蓝色下划线了我上面提到的细节。 希望这可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2014-11-04
    • 2016-11-16
    • 2015-10-28
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多