在 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 秒。不过,硬编码睡眠不是一个好的选择。您应该执行以下操作之一
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 上抓取个人资料网址