首页 > 解决方案 > 如何使用 Selenium 在 Headless 模式下使用 Google Chrome 查找 XPath?

问题描述

我正在尝试从谷歌获取一些商店/公司的手机号码等信息,并将其存储在 Excel 表上。

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

它在正常模式下与 Chrome 一起工作,它使用 XPath 找到元素,但当我在无头模式下使用 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 中复制商店的手机号码,但找不到该元素。

标签: excelvbaseleniumxpathgoogle-chrome-headless

解决方案


我已经python selenium使用 chrome headless 模式进行了验证,每次运行此代码时它都可以正常工作。我使用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


推荐阅读