【问题标题】:How to find XPath with Google Chrome in Headless mode using Selenium?如何使用 Selenium 在 Headless 模式下使用 Google Chrome 查找 XPath?
【发布时间】:2019-10-20 23:05:08
【问题描述】:

我正在尝试从 Google 获取信息,例如某些商店/公司的手机号码,并将其存储在 Excel 工作表中。

我使用 Chrome 驱动程序 (v_74.0.3729.6)。

它在普通模式下与 Chrome 一起工作,它使用 XPath 找到元素,但当我在 headless 模式下使用 Chrome 时却找不到。

我尝试改变窗口的大小并添加一些选项:

.AddArgument ("--window-size=1920,1080")
.AddArgument ("--no-sandbox")
.AddArgument ("--start-maximized")
.AddArgument ("--disable-gpu")
.AddArgument ("--disable-extensions")

我也尝试了不同的 XPath(但如果它在没有无头模式的情况下工作,我想 XPath 是正确的):

browser.FindElementsByXPath("(//span[@class='LrzXr zdqRlf kno-fv'])[1]")
browser.FindElementsByXPath("//*[@id='uid_6']/div[1]/div[2]/div[4]/div/div/span[2]")

我还尝试设置等待时间(以确保页面已完全加载):
Application.Wait (Now + TimeValue("0:00:2"))

Dim browser As New ChromeDriver

With browser
    .AddArgument ("--window-size=2160,3840")
    .AddArgument ("--headless")
End With

denomination = "Fnac Lyon Bellecour"
adresse = "85 Rue de la République 69002 Lyon"
browser.Get ("https://www.google.com")
browser.FindElementByName("q").SendKeys (denomination & " " & adresse)
SendKeys "~"

Application.Wait (Now + TimeValue("0:00:2"))

If browser.FindElementsByXPath("(//span[@class='LrzXr zdqRlf kno-fv'])[1]").Count >= 1 Then
    telephone = browser.FindElementByXPath("(//span[@class='LrzXr zdqRlf kno-fv'])[1]").Text
    Sheets("Donnees").Cells(1, 13).Value = telephone
End If

它通常会复制单元格M1中商店的手机号码,但它找不到元素。

【问题讨论】:

  • 我已经尝试使用带有 chrome 无头模式的 python selenium,它工作正常。
  • 不需要使用索引,因为它只是元素//span[@class='LrzXr zdqRlf kno-fv']
  • 你得到什么错误信息,在哪一行?
  • @KunduK :它在 Python 上也适用于我,但我不知道为什么它不适用于 headless 模式 上的 Excel 上的 VBA。使用 VBA 在普通模式下没问题。
  • @QHarr 使用此代码我没有错误,程序只是没有进入“If”循环。

标签: excel vba selenium xpath google-chrome-headless


【解决方案1】:

我已经使用 chrome 无头模式使用 python selenium 进行了验证,每次运行此代码时它都可以正常工作。 我使用了WebdriverWait,这是显式等待并等待元素可点击,然后获取文本值。

相信你可以在VBA修改这段代码。

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

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('window-size=1920x1080');
driver=webdriver.Chrome(options=chrome_options)
driver.get("https://www.google.com")
denomination = "Fnac Lyon Bellecour"
adresse = "85 Rue de la République 69002 Lyon"
element=driver.find_element_by_name('q')
element.send_keys(denomination + ' ' + adresse)
element.submit()
print(WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//span[@class='LrzXr zdqRlf kno-fv']"))).text)

输出:

+33 825 02 00 20

【讨论】:

  • 我尝试设置 10 秒的等待时间,在无头模式下无济于事。 (我等不及要一个特定的元素,因为它会返回一个错误,而不是让我处理没有创建元素的情况)
  • @Sakyo : 可以调整你的窗口大小并检查你得到了什么?
  • 我尝试了一些随机尺寸,2160x3840 和 1080x1920。还是一样,就是没有找到元素。
猜你喜欢
  • 2018-01-19
  • 2021-02-22
  • 1970-01-01
  • 2018-07-05
  • 2019-11-26
  • 2019-05-08
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多