Selenium 点击和手动点击 return 个不同的当前 URL

Selenium click and manual click return different current URLs

我遇到了问题

我在 google https://www.google.com/search?q=sen%20do&uule=w+CAIQICIZSG8gQ2hpIE1pbmggQ2l0eSwgVmlldG5hbQ%3D%3D 上搜索了这个,然后手动点击了第一个结果(这个 link 附有广告), 我得到了当前的 url https://www.sendo.vn/?utm_source=google&utm_medium=affiliate&utm_campaign=333629566-13485316726&gclid=EAIaIQobChMI9eKR_YCh9AIVCz5gCh2ang22EAAYASAAEgI80_D_BwE

与上面的 link 相同,使用下面的代码但它只返回 https://www.sendo.vn/(缺少参数)

这是代码

driver.get("${the_above_google_search_url}")

// Find first result element
Web firstResultElement = driver.findElement(By.className("iUh30"))

firstResultElement.click()

String currentUrl = driver.getCurrentUrl()

有没有像手动点击一样使用 Selenium 获得完整 url 路径的解决方案?

我进入了您的网站并检查了页面,我发现在点击 google 搜索的第一个结果后,有两个重定向 (状态 302)

并且第二个重定向具有您在 header 位置 中查找的 url 因为是重定向 (302):

如果您等待,浏览器将执行第二次重定向并加载 url:

解决方案 1

Wait until the second redirect and then, get the url with the classic methods.

Web 是基于 React 开发的,这就是为什么使用 javascript 呈现的原因。这使 selenium 自动化有点复杂。

您需要搜索一个元素,该元素的存在表明您在第二次重定向后网络已准备就绪。我发现了这个:

document.querySelector('[aria-label="sendo logo"]');

将此 querySelector 翻译成 selenium:

By.cssSelector("a[aria-label='sendo logo']");

并且 wait 为:

wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("a[aria-label='sendo logo']")));

如果在此元素之后,您一直得到相同的 url 而不是完整的 url,只需尝试另一个 html 元素。

解决方案 2

Try to get the headers of the page using selenium