Selenium не может получить элемент по xpath в режиме без головы Ubuntu 18.04 - PullRequest
0 голосов
/ 30 марта 2020

Я хочу развернуть свой Python скрипт на сервере Ubuntu и вызвать его через cron. На моей локальной машине Windows я пробовал headless, и она работает отлично, я даже могу сделать скриншоты в ней. Но выполнение сценария на сервере приводит к ошибкам, таким как элемент не может быть найден. Может кто-нибудь сказать мне, что происходит с этим?

Воспроизведена ошибка:

File "DomainScraper.py", line 30, in <module>
    login = driver.find_element_by_xpath('//a[@href="'+login_url+'"]').click()
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/ubuntu/.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":"xpath","selector":"//a[@href="https://account.domaintools.com/log-in/?r=https%3A%2F%2Freversewhois.domaintools.com%2F%3Frefine"]"}
  (Session info: headless chrome=81.0.4044.17)

Мой код, который я развернул на сервере:

#imports...

options = Options()
options.add_argument('--incognito')
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-extensions')
options.add_argument('--disable-infobars')
options.add_argument('--allow-running-insecure-content')
driver = webdriver.Chrome(options=options)
driver.delete_all_cookies()

driver.implicitly_wait(3)
url = "https://reversewhois.domaintools.com/?refine#q=%5B%5B%5B%22whois%22%2C%222%22%2C%22VerifiedID%40SG-Mandatory%22%5D%5D%5D"
driver.get(url)
driver.save_screenshot("sample.png")
login_url = 'https://account.domaintools.com/log-in/?r=https%3A%2F%2Freversewhois.domaintools.com%2F%3Frefine'
login = driver.find_element_by_xpath('//a[@href="'+login_url+'"]').click()

username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")
username.send_keys("**********************")
password.send_keys("***************")
# time.sleep(5)
driver.find_element_by_id("password").send_keys(Keys.ENTER)

pageNumber = 0
while True:
    driver.implicitly_wait(3)
    driver.get('https://reversewhois.domaintools.com/?ajax=mReverseWhois&call=ajaxGetPreviewPage&q=%5B%5B%5B%22whois%22%2C%222%22%2C%22VerifiedID%40SG-Mandatory%22%5D%5D%5D&o='+str(pageNumber))
    time.sleep(3)
    pre = driver.find_element_by_tag_name("pre").text
    data = json.loads(pre)
    if data['body']:
        table = data['body']
        tables = pd.read_html(table,skiprows=1)
        df = tables[-1]
        df.to_csv('Domains.csv', mode='a', sep=',',index=False)
        print(df.to_string(index=False))
        pageNumber += 1
        # print(pageNumber)
        continue
    else:
        break

Обновление:

Пробовал использовать и устанавливать обе библиотеки

sudo apt install -y xvfb
pip install pyvirtualdisplay

и добавил это перед запуском Chrome

from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

, кажется, не работает в конце концов. Я сделал снимок экрана и получил следующий вывод:

Когда я не использую библиотеку xvfb, я получаю только белый экран. enter image description here

Я думаю, что Селен не может открыть URL. Что мне с этим делать?

1 Ответ

1 голос
/ 30 марта 2020

Вы уверены, что элемент виден? Я заметил, что размер по умолчанию windows в головном телефоне не такой, как в обычном режиме.

Вы можете попробовать изменить размер окна с помощью:

options.add_argument('window-size=1200x1040')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...