【问题标题】:Changing the "user-agent" header using selenium with phantomJS使用带有 phantomJS 的 selenium 更改“用户代理”标头
【发布时间】:2015-12-18 16:06:22
【问题描述】:

我正在尝试使用 selenium 登录表单,但出现了一个奇怪的错误。我很肯定它与用户代理标头有关,但如果不是,我想知道如何去做。

这是表单中的登录功能:

def log_in_phantom(username, password, url):
    dcap = dict(DesiredCapabilities.PHANTOMJS) 
    dcap["phantomjs.page.settings.userAgent"] = (<My user-agent>)
    browser = webdriver.PhantomJS(desired_capabilities = dcap)
    browser.get(url)
    browser.implicitly_wait(3)

    username = browser.find_element_by_id("username")
    if username.is_displayed():
        username.send_keys(username)

    password = browser.find_element_by_id("password")
    if password.is_displayed():
        password.send_keys(password)

    button = browser.find_element_by_class_name("btn-default")
    if button.is_displayed:
        button.click()

    session = browser.session_id
    print(browser.current_url)

这是我运行该函数时得到的结果:

selenium.common.exceptions.ElementNotVisibleException: Message: Error                   Message => 'Element is not currently visible and may not be manipulated'
 caused by Request => {<bunch of cookie data>}

在这个 cookie 数据中,我注意到

{"User-agent":"Python-urllib/3.5}

所以我更改标题的尝试没有成功。我是否使用了所需的功能?我还缺少什么?我是网络抓取的新手,所以它真的可以是任何东西。

感谢您的宝贵时间

【问题讨论】:

  • 你确定没有其他带有id="username"的元素吗?
  • 还有一个,是隐藏字段。
  • 你能解决这个问题吗?我也面临同样的问题

标签: python selenium selenium-webdriver phantomjs


【解决方案1】:

另一个具有id="username" 的隐藏字段在这里引起了问题。

理想情况下,您应该使定位器更具体以匹配可见元素,例如:

driver.find_element_by_css_selector("div.login-form #username")

你也可以这样过滤掉可见元素:

username = next(element for element in driver.find_elements_by_id("username") 
                if element.is_displayed())
username.send_keys("test")

您可能还需要在搜索元素之前添加显式等待:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "username"))
)

【讨论】:

  • 可见域和隐藏域的结构类似,所以我尝试了迭代。出于某种原因,我得到了“StopIteration”。我知道可见字段的 id 是用户名
  • 这可能行不通,因为 PhantomJS (v1.x?) 有一个错误,即只有第一个匹配的 id 用于选择器,无论该选择器的具体程度如何。可能根本找不到元素。 "div.login-form [id='username']" 可能是一个更好的主意。
  • @ArtjomB。谢谢!让我们看看等待+过滤可见元素是否会有所帮助..
猜你喜欢
  • 2016-12-05
  • 2014-02-17
  • 2013-06-25
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多