我有一个访问打印机的脚本,当Chrome正常运行时,我的代码完全正常,但是当它运行无头时,selenium似乎无法在网页上找到元素。
以下是相关代码:
init方法:
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)
答案 0 :(得分:2)
如果这是SSL证书的问题,您可以使用命令行标志启动Chrome而不使用证书(假设您是如何启动它)。我认为切换为--allow-running-insecure-content
,我从此列表中找到了here。
答案 1 :(得分:1)
Chrome-headless无法使用无效的https证书。您 只会得到一个空白页面!看到 http://bugs.chromium.org/p/chromium/issues/detail?id=721739
答案 2 :(得分:1)
我遇到了同样的问题,发现无头元件的加载速度较慢。 通过添加以下代码行,问题消失了:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
答案 3 :(得分:1)
我有同样的问题。您可以截屏以了解问题所在。
driver.get_screenshot_as_file("screenshot.png")
硒正常运行但无法在无头模式下工作的一些原因-
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/上找到有关此内容的更多信息。
答案 4 :(得分:1)
我确实面对过这个问题,但是下面的代码对我来说却像冠军一样。
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);
答案 5 :(得分:0)
我遇到了同样的情况。经过研究,以下是正确的:
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)