【问题标题】:Headless Chrome Element is not clickable (works in browser mode)无头 Chrome 元素不可点击(在浏览器模式下工作)
【发布时间】:2020-07-05 18:41:09
【问题描述】:

我使用 Selenium 编写了一个脚本,它可以在浏览器模式下运行。但是,当我在 Headless 模式下尝试时,它不再起作用。我添加了参数以将窗口大小更改为我的屏幕分辨率;但是,这仍然没有解决问题。奇怪的是一些按钮可以工作,而其他按钮则不能。不太清楚怎么回事。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
user_input='xyz'
def get_sequence():
    options = Options()
    options.add_argument("--window-size=1920,1080");
    options.add_argument("--start-maximized");
    options.add_argument("--headless");
    driver = webdriver.Chrome(options=options)
    driver.get('https://clims4.genewiz.com/RegisterAccount/Login')
    fill_box = driver.find_element_by_xpath('//*[@id="LoginName"]')
    fill_box.clear()
    fill_box.send_keys('*****')
    fill_box = driver.find_element_by_xpath('//*[@id="Password"]')
    fill_box.send_keys('*****')
    driver.find_element_by_xpath('//*[@id="btnSubmit"]').click()
    table = driver.find_element_by_xpath('//*[@id="myOrdersTable"]/tbody')
    for i,td in enumerate(table.find_elements_by_xpath('//*[@id="myOrdersTable"]/tbody/tr/td[4]'),1):
        if td.text == user_input:
            driver.find_element_by_xpath(f'//*[@id="myOrdersTable"]/tbody/tr[{i}]/td[11]/button').click()
            break

    time.sleep(5)
    seq_list=[]
    table=driver.find_element_by_xpath('//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody')
    for x,sequence in enumerate(table.find_elements_by_xpath('//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr/td[9]'),1):
        driver.find_element_by_xpath(f'//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr[{x}]/td[9]/span[2]').click()
        time.sleep(5)
        seq_info=driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[2]/div')
        seq_list.append([seq_info.text])
        driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button').click()
        time.sleep(5)

get_sequence():

如果您删除无头选项/参数,上述方法有效。这是目前上面的输出。

[0705/143642.917:INFO:CONSOLE(66)] "visitorResponseData set", source: https://eastprodcdn.azureedge.net/bundles/legacy/velaro.inline.9b226ddb.js (66)
[0705/143644.640:INFO:CONSOLE(3)] "Hotjar not launching due to suspicious userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/83.0.4103.116 Safari/537.36", source: https://static.hotjar.com/c/hotjar-1144113.js?sv=6 (3)
[0705/143645.765:INFO:CONSOLE(66)] "visitorResponseData set", source: https://eastprodcdn.azureedge.net/bundles/legacy/velaro.inline.9b226ddb.js (66)
 driver.find_element_by_xpath(f'//*[@id="myOrdersTable"]/tbody/tr[{i}]/td[11]/button').click()
  File "C:\Users\Sams PC\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Users\Sams PC\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\Sams PC\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Sams PC\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <button type="button" class="btn btn-sm gwz-grid-action" data-orderid="155e7035-5540-4fc5-8045-247511d0f7dc">...</button> is not clickable at point (1793, 959). Other element would receive the click: <div id="hs-eu-cookie-confirmation" class="hs-cookie-notification-position-bottom" data-nosnippet="">...</div>
  (Session info: headless chrome=83.0.4103.116)

只是为了增加可读性,这个脚本只是去一个站点,在站点内的一个表中搜索 user_input,然后单击一个按钮。然后,新页面包含另一个表,单击按钮会生成一个弹出窗口,其中包含您要提取的数据。

编辑: 这些是我尝试过的解决方案:

options = Options()
    options.add_argument("--window-size=1920,1080")
    options.add_argument("--start-maximized")
    options.add_argument("--disable-gpu")
    options.add_argument('--disable-extensions')
    options.add_argument('--no-sandbox')
    options.add_argument("--headless")
    driver = webdriver.Chrome(options=options)

另外,浏览器模式下的浏览器窗口大小为 1554,882(当它工作时),所以我什至补充道:

driver.set_window_size(1554,842)

它仍然没有工作。这不是浏览器大小的问题。

【问题讨论】:

  • 根据错误日志。 Cookies 消息正在拦截点击。在与页面上的任何元素交互之前,接受“此网站在您的计算机上存储 cookie....'id="hs-eu-cookie-confirmation-inner"'
  • 抱歉,忘记删除/回答这个问题了。是的,弹出了一个 cookie 警告,但它不会在浏览器模式下弹出,因为该网站记得我之前已经接受了警告。

标签: python selenium google-chrome selenium-webdriver


【解决方案1】:

解决了这个问题,这是一个关于使用 cookie 的网站的弹出窗口。它没有出现在浏览器模式下,因为我之前已经接受了该弹出窗口,并且该网站记住了我。它也不会影响其他按钮,因为它位于页面的下半部分(仅与一个按钮重叠,即给出错误的按钮)。我能够使用隐身模式再次弹出,并获取其元素,并在继续执行我的脚本的其余部分之前单击该按钮添加额外的一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2021-11-06
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多