我想在运行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,因为这是硒的用途。
答案 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))
说明:
借助该解决方案,我现在可以将此函数与任何更改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()对我不起作用!