无法在硒上获取当前网址

时间:2018-03-30 18:30:49

标签: python-3.x selenium

我想在运行Selenium时获取当前的url。 我查看了这个stackoverflow页面: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,因为这是硒的用途。

3 个答案:

答案 0 :(得分:3)

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

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

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

  • 保持轮询网址并等待更改发生或网址
  • 等待新页面出现时您知道的对象
  • 而不是使用Keys.Enter在搜索按钮上使用.click()模拟操作(如果可用)

通常当您在selenium中使用click方法时,它会关注页面更改,因此您不会看到此类问题。在这里你使用selenium按一个键,它不会等待页面加载。这就是你在第一时间看到问题的原因

答案 1 :(得分:1)

我遇到了同样的问题,并且想出了使用默认显式等待(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))

说明:

  1. 首先,我创建了自己的 wait条件see here),该方法将old_url作为参数(执行操作之前的网址),并检查旧url是否与current_url相同经过一些动作。如果两个网址相同,则返回false,否则返回true。
  2. 然后,我创建了上下文管理器来包装要执行的操作,并在执行操作之前保存了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秒钟后它将抛出异常而停止等待。

您对此有何看法?

答案 2 :(得分:0)

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