Selenium 仅在使用无头 Chrome 时无法定位元素(Python)

2023-11-22

我刚刚开始学习 Selenium,需要使用云中的 jenkins 机器验证登录网页,该机器没有 GUI。我设法在具有 UI 的系统上成功运行该脚本。然而,当我修改脚本以无头运行时,它失败说无法定位元素。 我的脚本如下:

#!/usr/bin/env python3

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
import time
import argparse


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--window-size=1120, 550')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--allow-running-insecure-content')

driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_options)
driver.implicitly_wait(5)

lhip = '13.14.15.16'
user = 'username'
paswd = 'password'


parser = argparse.ArgumentParser()

parser.add_argument('-i', '--lh_ip',    type=str, metavar='', default=lhip,     help='Public IP of VM' )
parser.add_argument('-u', '--usr',      type=str, metavar='', default=user,     help='Username for VM')
parser.add_argument('-p', '--pwd',      type=str, metavar='', default=paswd,    help='Password for VM')

args = parser.parse_args()


lh_url = 'https://' + args.lh_ip + '/login/'
driver.get(lh_url)
try:
    if driver.title == 'Privacy error':
        driver.find_element_by_id('details-button').click()
        driver.find_element_by_id('proceed-link').click()
except:
    pass

driver.find_element_by_id('username').send_keys(args.usr)
driver.find_element_by_id('password').send_keys(args.pwd)
driver.find_element_by_id('login-btn').click()
driver.implicitly_wait(10)
try:
    if driver.find_element_by_tag_name('span'):
        print('Login Failed')
except:
    print('Login Successful')
driver.close()

当不使用 chrome_options 时,python 脚本在我的系统上运行良好。然而,将它们添加到无头模式下运行后,它会失败并显示以下输出:

[WDM] - Current google-chrome version is 85.0.4183
[WDM] - Get LATEST driver version for 85.0.4183
[WDM] - Driver [/home/ramesh/.wdm/drivers/chromedriver/linux64/85.0.4183.87/chromedriver] found in cache
Traceback (most recent call last):
  File "/home/ramesh/practice_python/test_headless.py", line 44, in <module>
    driver.find_element_by_id('username').send_keys(args.usr)
  File "/home/ramesh/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/home/ramesh/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/home/ramesh/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/ramesh/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="username"]"}
  (Session info: headless chrome=85.0.4183.121)

由于我学习了大约一天的 Selenium,我可能会做一些相当愚蠢的事情,所以如果有人告诉我我做错了什么,我将非常感激。我用谷歌搜索了很多,尝试了很多东西,但都没有成功。 另外,当我只使用 id 作为用户名时,为什么它说“css 选择器”?


如果脚本在没有无头模式的情况下工作得很好,则窗口大小可能存在问题。除了指定 --no-sandbox 选项外,尝试更改传递给网络驱动程序的窗口大小

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

这个窗口大小适合我的情况。

即使这不起作用,您可能需要添加之前回答的等待计时器,因为与 UI 模式下的浏览器相比,无头模式下的渲染工作方式不同。

无头模式渲染参考 -https://www.toolsqa.com/selenium-webdriver/selenium-headless-browser-testing/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium 仅在使用无头 Chrome 时无法定位元素(Python) 的相关文章

随机推荐

  • 宽度以百分比设置的“position:fixed”侧边栏?

    I ve successfully used the beautiful Susy grid system to create a responsive layout similiar to the one of WebDesignerWa
  • 如何在点击android中的edittext时显示自定义键盘

    我的应用程序中有一个自定义键盘 问题是如何在单击 edittext 时播放此键盘 我使用 setonfocuschangre 侦听器 现在当 edittext 焦点更改时会出现自定义键盘 但我想在每次单击 edittext 时显示此键盘 我
  • 什么是 NullReferenceException,如何修复它?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我有一些代码 当它执行时 它会抛出一个NullReferenceException 说 你调用的对象是空的 这是什么意思 我该如何修复此错误 原因是什么 底线
  • Rails - 测试装置错误 NoMethodError:nil 的未定义方法“类型”:NilClass

    我在运行使用具有模型之间关联的装置的测试时遇到问题 这是我一运行就收到的错误rake test ERROR test truth SevenPortfolioTest 0 005154775 test truth SevenPortfoli
  • 如何将 MongoDB 文档转换为 JSON 对象

    我正在尝试使用从查找查询返回的 MongoDB 文档作为 NodeJS 中的请求正文发出发布请求 但是在服务器上我收到错误 无效的 JSON 以下是我尝试发布的文档 id ObjectId 5739a6bf3f1b41477570dc89
  • 任意分隔符/转义字符处理的最佳算法是什么?

    令我有点惊讶的是 网上没有任何关于此问题的信息 而且我不断发现这个问题比我想象的要棘手一些 规则如下 您从分隔 转义数据开始将其拆分为数组 分隔符是一个任意字符 转义字符是任意一个字符 分隔符和转义字符都可以出现在数据中 正则表达式很好 但
  • 组织Android SDK的代码文件/XML文件

    有人可以提供一些组织我的项目以使其干净的策略吗 假设我有很多活动 将它们全部放入一个单独的包中 同时将其他类 例如自定义适配器 放入另一个包中以更好地分离 逻辑 是否很好 另外 在为布局创建 XML 文件时 如果我有一些用于某些活动的布局和
  • 修复 CSS 流体网格中的子像素舍入问题

    我正在尝试创建一个流畅的 CSS 网格 它适用于 Firefox 和 IE8 但不适用于 Safari Chrome Opera 其中子像素舍入问题变得可见 http jsfiddle net bJKQ6 2 column float le
  • 为什么 BinaryReader.ReadUInt32() 会反转位模式?

    我正在尝试使用 BinaryReader 类读取二进制文件 并且我需要将其作为 UInt32 块读取 然后进行一些位移等操作 但是 由于某种原因 当我使用 ReadUInt32 方法时 位顺序会颠倒 例如 如果我有一个文件 其中前四个字节的
  • 传递配置参数以在 R 中安装包

    我正在尝试安装一个包R来自 CRAN 存储库 我必须在配置阶段 但我不知道如何做到这一点install packages gt install packages Rmpfr checking mpfr h usability no chec
  • 在 Vue.js 中,如何查找哪些数据更改导致组件重新渲染?

    在 Vue js 中 当某些数据发生变化时 组件会重新渲染 更新 有时重新渲染频率太频繁 我想找出哪些数据的更改导致了此重新渲染 如何找出导致重新渲染的更改数据 Using 深度差异和一个简单的观察程序 您可以轻松找到虚拟机数据的先前副本之
  • 为什么“tail”不能截断日志文件?

    我正在尝试使用 cron 脚本管理日志文件大小 我基本上想每晚删除日志文件中除最后 2000 行之外的所有内容 我正在尝试运行此命令 但它似乎正在清空整个文件而不是执行我想要的操作 tail 2000 日志文件 txt gt 日志文件 tx
  • CakePHP 数据库表,缺少默认数据源

    I found this类似的问题 但我的问题不同 我将 CakePHP 2 2 应用程序移至另一台服务器 迁移前不存在任何问题 迁移后大多数事情都运行良好 我可以访问我的大部分数据库表等 但是当我尝试访问我的其中一个表时 我收到此错误 E
  • 将 Sqlite BigInt 转换为日期

    我有一个 Sqlite 数据库 用作 Quartz net 调度程序作业的 ado net 作业存储 在一个表中 名为 START TIME 的列的类型为 big int 有没有办法将 bigint 转换或转换为日期值 我希望能够查询数据库
  • JSON - 无法使用 Jackson 序列化对象内的 JSONObject

    我有以下课程 class A String abc String def appropriate getters and setters with JsonProperty Annotation 我打电话给Jacksons objectMa
  • 如何防止未启用的 EditText 出现键盘

    我的活动有一个EditText据称 在用户单击屏幕的编辑按钮之前 该内容是不可编辑的 I did edit setEnabled false 但仍然会为用户显示一个键盘 并且可以将值添加到EditText通过键盘在屏幕上显示 即使屏幕可能看
  • json -c json_object_to_json_string 释放内存时

    我正在使用 json c 库将 json object 发送到客户端 我注意到没有本机函数来释放 json object to json string 分配的内存 该库会自动释放它吗 或者我必须 free str 以避免内存泄漏 我试图阅读
  • 服务定位器、依赖注入(和容器)和控制反转

    我已经编程有一段时间了 但从来没有兴趣从理论上了解每个概念的含义 我可能正在使用各种编程概念 但我并不知道 服务定位器 对我来说 指的是通过减少代码量来加快开发速度的捷径记录 一个问题是 定位器可以仅引用名称空间 类 或者我可以拥有变量注册
  • 从 Enum 中的类初始化一个新对象

    我有一个名为 Plugins 的枚举 public enum Plugins ROTATING LINE plugin rotatingline RotatingLine class SNOW SYSTEM plugin snow Snow
  • Selenium 仅在使用无头 Chrome 时无法定位元素(Python)

    我刚刚开始学习 Selenium 需要使用云中的 jenkins 机器验证登录网页 该机器没有 GUI 我设法在具有 UI 的系统上成功运行该脚本 然而 当我修改脚本以无头运行时 它失败说无法定位元素 我的脚本如下 usr bin env