在 selenium 上获取当前网址时遇到问题

Posted

技术标签:

【中文标题】在 selenium 上获取当前网址时遇到问题【英文标题】:trouble getting the current url on selenium 【发布时间】:2018-09-09 19:09:14 【问题描述】:

我想在运行 Selenium 时获取当前 url。 我查看了这个 *** 页面:How do I get current URL in Selenium Webdriver 2 Python? 并尝试了发布的内容,但它不起作用。我在下面附上我的代码:

from selenium import webdriver
#launch firefox
driver = webdriver.Firefox()
url1='https://poshmark.com/search?'

# search in a window a window
driver.get(url1)
xpath='//input[@id="user-search-box"]'
searchBox=driver.find_element_by_xpath(xpath)

brand="freepeople"

style="top"

searchBox.send_keys(' '.join([brand,"sequin",style]))

from selenium.webdriver.common.keys import Keys
#EQUIValent of hitting enter key
searchBox.send_keys(Keys.ENTER)



print(driver.current_url)

我的代码打印https://poshmark.com/search?但它应该打印:https://poshmark.com/search?query=freepeople+sequin+top&type=listings&department=Women,因为这就是 selenium 的用途。

【问题讨论】:

问题是您的searchBox.send_keys(Keys.ENTER)print(driver.current_url) 之间没有延迟。应该有一些时间延迟,以便语句可以选择 url 更改。如果您的代码在 url 实际更改之前触发,它只会为您提供旧 url。解决方法是添加 time.sleep(1) 以等待 1 秒。 呵呵,我想知道是不是这样 这就是问题所在!谢谢! :) 【参考方案1】:

问题是您的searchBox.send_keys(Keys.ENTER)print(driver.current_url) 之间没有延迟。

应该有一些时间延迟,以便语句可以选择 url 更改。如果您的代码在 url 实际更改之前触发,它只会为您提供旧 url。

解决方法是添加 time.sleep(1) 以等待 1 秒。不过,硬编码睡眠不是一个好的选择。您应该执行以下操作之一

继续轮询 url 并等待更改发生或 url 等待新页面出现时您知道会出现的对象 如果搜索按钮可用,则不要使用Keys.Enter 在搜索按钮上使用.click() 模拟操作

通常当您在 selenium 中使用 click 方法时,它会处理页面更改,因此您不会看到此类问题。在这里,您使用 selenium 按一个键,它不会执行任何等待页面加载的操作。这就是您首先看到问题的原因

【讨论】:

最好等待 URL 更改,而不是等待硬编码秒。 @JeffC,同意并更新了一些想法【参考方案2】:

我遇到了同样的问题,我想出了使用默认显式等待 (see how explicit wait works in documentation) 的解决方案。

这是我的解决方案

class UrlHasChanged:
def __init__(self, old_url):
    self.old_url = old_url

def __call__(self, driver):
    return driver.current_url != self.old_url:


@contextmanager
def url_change(driver):
     current_url = driver.current_url
     yield
     WebDriverWait(driver, 10).until(UrlHasChanged(current_url))

解释:

    首先,我创建了自己的等待条件 (see here),它以 old_url 作为参数(执行操作之前的 url)并检查旧 url 是否与 current_url 相同行动。当两个 url 相同时返回 false,否则返回 true。 然后,我创建了上下文管理器来包装我想要执行的操作,并在执行操作之前保存了 url,然后我使用了 WebDriverWait 和在等待条件之前创建。

多亏了那个解决方案,我现在可以通过任何改变 url 的操作来重用这个函数来等待这样的改变:

    with url_change(driver):
        login_panel.login_user(normal_user['username'], new_password)

    assert driver.current_url == dashboard.url

这是安全的,因为WebDriverWait(driver, 10).until(UrlHasChanged(current_url)) 一直等到当前 url 发生变化,10 秒后它会通过抛出异常停止等待。

您对此有何看法?

【讨论】:

【参考方案3】:

我通过使用 href 单击按钮解决了这个问题。然后执行 driver.get(hreflink)。 Click() 对我不起作用!

【讨论】:

以上是关于在 selenium 上获取当前网址时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中使用 Selenium 与 wep 页面交互时遇到问题

使用 selenium 在 LinkedIn 上抓取个人资料网址

selenium+python

python+selenium环境搭建以及遇到的坑

在 Selenium IDE 中,如何获取基本 url 的值

使用“Requests-HTML”库获取交易价格时遇到问题