Безголовый веб-драйвер возвращает ошибку, но безголовые работы - PullRequest
0 голосов
/ 26 октября 2018

Я делаю простой эксперимент с Amazon и Webdriver.Тем не менее, использование Webdriver Headless не может найти элементы и ошибки, но работает без головы.

Есть предложения, как заставить его работать без головы?Прямо над флагом --headless есть комментарий.

from selenium import webdriver
import sys
import os

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def get_inventory(url):

    chrome_options = Options()

    # Making it headless breaks. Commenting
    # this line, making it non-headless works.  
    chrome_options.add_argument("--headless")

    chrome_options.add_experimental_option(
        "prefs", {'profile.managed_default_content_settings.javascript': 2})
    chrome_options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'

    driver = webdriver.Chrome(executable_path=os.path.abspath(
        'chromedriver'), chrome_options=chrome_options)

    driver.set_window_size(1200, 1000)

    try:
        driver.get(url)

        add_to_cart_button_xp = '//*[@id="add-to-cart-button"]'
        add_to_cart_button = driver.find_element_by_xpath(add_to_cart_button_xp)
        add_to_cart_button.click()

        driver.get('https://www.amazon.com/gp/cart/view.html/ref=lh_cart')

        qty_field_xp = '//div/input[starts-with(@name, "quantity.") and @type="text"]'
        qty_field = driver.find_element_by_xpath(qty_field_xp)
        qty_field.clear()
        qty_field.send_keys("2")

        update_link_xp = f'//input[@value="Update" and @type="submit"]'
        update_link = driver.find_element_by_xpath(update_link_xp)
        update_link.click()



url = 'https://www.amazon.com/Pexio-Professional-Stainless-Food-Safe-Dishwasher/dp/B07BGBSY9F'
get_inventory(url)

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Я подтвердил вашу претензию на своем Mac (используя /Applications/Google Chrome.app/Contents/MacOS/Google Chrome).

Я предполагаю, что, поскольку вы переходите со страницы товара на страницу корзины Amazon, файлы cookie теряются, поэтомуна странице корзины не будет отображаться какой-либо элемент, и, следовательно, не будет никакого текстового ввода с именем, начинающимся с «количества», что и является исключением.

Поиск в Google для безголовых хромовых файлов cookie приводит к этой странице , которая в свою очередь указывает на эту страницу , содержание которой может также относится к вашей проблеме.Будь то это или особенно умное поведение веб-сайта Amazon, факт остается фактом: cookie-файл, в котором хранится корзина (или ее ключ, но результат тот же), не читается страницей корзины в автономном режиме..

0 голосов
/ 08 ноября 2018

Я думаю, у вас просто были проблемы с селектором.Я проверил элементы и обновил настройку количества;все остальное должно быть примерно таким же, за исключением двоичных местоположений.

from selenium import webdriver
import sys
import os

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def get_inventory(url):
    chrome_options = Options()

    chrome_options.add_argument("--headless")

    driver = webdriver.Chrome(
        executable_path='/usr/bin/chromedriver', 
        chrome_options=chrome_options,
    )
    chrome_options.add_experimental_option(
        "prefs", 
        {'profile.managed_default_content_settings.javascript': 2},
    )
    chrome_options.binary_location = '/usr/bin'

    driver.set_window_size(1200, 1000)

    try:
        driver.get(url)
        driver.save_screenshot("/tmp/x1.png")

        driver.find_element_by_xpath('//*[@id="add-to-cart-button"]').click()

        driver.get('https://www.amazon.com/gp/cart/view.html/ref=lh_cart')

        driver.find_element_by_xpath("//span[@data-action='a-dropdown-button']").click()
        driver.find_element_by_xpath("//*[@class='a-dropdown-link'][text()[contains(., '2')]]").click()

        driver.find_element_by_class_name("nav-logo-base").click()

        driver.save_screenshot("/tmp/confirm.png")
        driver.close()
    except Exception as e:
        print(e)


url = 'https://www.amazon.com/Pexio-Professional-Stainless-Food-Safe-Dishwasher/dp/B07BGBSY9F'
get_inventory(url)

Я запустил это с и без --headless, и он работает нормально для меня.В конце я перешел на домашнюю страницу, чтобы вы могли подтвердить, что изменение количества сработало (отсюда и скриншот).

0 голосов
/ 26 октября 2018

Какое поведение вы видите?

Когда я включил безголовый, скрипты начали давать сбой, потому что запуск безголовый замедляет выполнение.

В настоящее время я запускаю Chrome с этими параметрами:

'--no-sandbox', '--headless', '--window-size=1920,1080', '--proxy-server="direct://"', '--proxy-bypass-list=*'

Предположительно, последние два параметра помогают с медлительностью, но я не вижу никакой разницы.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...