无法在带有无头Chrome的网页上定位元素

ff29svar  于 2023-09-28  发布在  Go
关注(0)|答案(9)|浏览(180)

我有一个访问打印机的脚本,当Chrome正常运行时,我的代码工作得很好,但是当它无头运行时,selenium似乎无法在网页上找到元素。
下面是相关代码:
初始化方法:

def __init__(self, ip_address):
    """ Initialize a new Printer_Webpage object."""
    self.ip_address = ip_address
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--window-size=1920x1080")
    self.browser = webdriver.Chrome(chrome_options=chrome_options)
    # Ignore lack of cert for each printer web page.
    # Otherwise, can't open page.
    self.browser.accept_untrusted_certs = True

登录方式:

def login(self):
    """Navigates through the login page for the printer."""
    # Open login page
    self.browser.get(f'https://{self.ip_address}/wcd/top.xml')
    # STEPS TO LOGIN:
    # 1) Select 'Administrator' radio button and click.
    self.browser.find_element_by_id('Admin').click()
    # 2) Select Login button and click.
    self.browser.find_element_by_xpath("//input[@type='submit' \
                                        and @value='Login']").click()
    # 3) Select admin (user mode)
    self.browser.find_element_by_id('R_ADM2').click()
    # 4) Select password field and input PASSWORD, then submit.
    password_field = self.browser.find_element_by_id('Admin_Pass')
    password_field.send_keys(PASSWORD)
    password_field.send_keys(Keys.RETURN)

完整错误消息:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"Admin"}

以下是一些可能有用的信息:

(Session info: headless chrome=62.0.3202.94)

(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.14393 x86_64)
w8f9ii69

w8f9ii691#

我也有同样的问题。你可以截图来了解什么是错的。

driver.get_screenshot_as_file("screenshot.png")

Selenium在正常运行时工作但在无头模式下停止工作的几个原因-
1)它可能已经切换到移动的模板。可以通过更改窗口大小来修复。

chrome_options.add_argument("--window-size=1920,1080")

2)如果它是一个空白页(截图),它可能是由于无效的SSL证书.(见@Marcel_Wilson帖子)它应该是固定的-

chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--allow-running-insecure-content')

3)网站可能会阻止“无头”模式。(您的屏幕截图可能会显示无法在正常模式下重新创建的错误)您可以尝试以下操作-

user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36'
options.add_argument(f'user-agent={user_agent}')

但是,如果网站有更强大的阻止方法,上述代码将无法工作。你可以在这里找到更多关于https://intoli.com/blog/making-chrome-headless-undetectable/

mbzjlibv

mbzjlibv2#

我遇到了同样的情况。经过研究,以下是正确的:

self.chrome_options = webdriver.ChromeOptions()
self.chrome_options.add_argument("--window-size=1920,1080")
self.chrome_options.add_argument("--disable-extensions")
self.chrome_options.add_argument("--proxy-server='direct://'")
self.chrome_options.add_argument("--proxy-bypass-list=*")
self.chrome_options.add_argument("--start-maximized")
self.chrome_options.add_argument('--headless')
self.chrome_options.add_argument('--disable-gpu')
self.chrome_options.add_argument('--disable-dev-shm-usage')
self.chrome_options.add_argument('--no-sandbox')
self.chrome_options.add_argument('--ignore-certificate-errors')
self.browser = webdriver.Chrome(options=self.chrome_options)
bfrts1fy

bfrts1fy3#

如果是SSL证书的问题,您可以使用命令行标志在没有证书的情况下启动Chrome(假设这是您启动它的方式)。我相信交换机是--allow-running-insecure-content,我从这个列表中找到了here

9lowa7mx

9lowa7mx4#

@siking在评论中指出……
Chrome-headless不适用于无效的https证书。你只会得到一个空白页!参见http://bugs.chromium.org/p/chromium/issues/detail?id=721739

ckx4rj1h

ckx4rj1h5#

我也遇到了同样的问题,发现元素在headless中加载得更慢。通过添加以下代码行,问题就解决了:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
f87krz0w

f87krz0w6#

我确实遇到了这个问题,但下面的代码对我来说就像一个冠军。

final ChromeOptions options = new ChromeOptions();
    options.addArguments("--window-size=1920,1080");
    options.addArguments("--allow-insecure-localhost");
    options.addArguments("--headless");
    options.addArguments("--disable-gpu");
    options.addArguments("--no-sandbox");
    DesiredCapabilities caps = DesiredCapabilities.chrome();
    caps.setCapability(ChromeOptions.CAPABILITY, options);
    caps.setCapability("acceptInsecureCerts", caps);
    WebDriver driver = new ChromeDriver(options);
mepcadol

mepcadol7#

我遇到了同样的问题,headless不能处理一些网站和元素(显示空白页面内容,找不到元素等)。
这很可能是因为缺少用户代理或窗口大小过小。添加以下参数:

"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
"--window-size=1920x1080"

如果上述方法不起作用,还有另一种方法可以通过最小化并将窗口移动到用户无法看到的位置来“模拟”无头模式。
这不会从任务栏隐藏chrome任务,但Chrome标签本身仍然会对用户隐藏。
只需使用以下参数:

var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments(new List<string>() { "--window-size=1,1", "window-position=-2000,0" });  // This hides the chrome window

var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;    // This is to hid the console.

ChromeDriver driver = new ChromeDriver(chromeDriverService, chromeOptions);
//driver.Manage().Window.Minimize(); //use this if the code above does not work
driver.Navigate().GoToUrl("https://google.com");
q7solyqu

q7solyqu8#

time.sleep(0.2)帮我修好了。
我也有同样的问题。在headless模式下,找不到一个webElement,selenium抛出NoSuchElementException,错误为:Message:no such element:无法定位元素。
对我来说,解决这个问题的方法是用time.sleep(0.2)在定位这个webElement的上面一行添加一个0.2秒的等待时间,这就解决了这个问题。
由于某些原因,在无头模式下加载此元素需要多一点时间。

yuvru6vn

yuvru6vn9#

根据最新更新,尝试使用--headless=new而不是--headless。这也可能是代码不工作的原因

相关问题