Питон, Scrapy, Selenium - заполните форму - PullRequest
2 голосов
/ 31 мая 2019

У меня есть страница, где я нажимаю на текст "Neu hier? Jetzt registrieren".Затем появится текстовое поле и кнопка.Как можно устранить ошибку?

Он не находит ни текстовое поле, ни кнопку.

HTML-часть:

<form method="post" action="./index.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">
<input type="text" class="email w_200" name="Email" value="" autocomplete="on" tabindex="1" />
<input type="button" class="submit bu" style="width: 197px" tabindex="4" value="Registrieren"/>
</form>

Результат из кода ниже:

start!ready!you are here!

Источник:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import scrapy
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from scrapy.http import Request
#https://github.com/mozilla/geckodriver/releases
class northshoreSpider(scrapy.Spider):
    name = 'xxx'
    allowed_domains = ['mypage.de']
    start_urls = ['http://mypage.de']

    def __init__(self, category='', **kwargs):
        print('start!')
        options = Options()
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        super().__init__(**kwargs)

        self.driver = webdriver.Chrome(executable_path='/home/chef/Desktop/chromedriver', chrome_options=options)

    def parse(self,response):
        self.driver.get('http://mypage.de')
        try:
            next = self.driver.find_elements_by_xpath("//*[contains(text(), 'Neu hier? Jetzt registrieren')]")[0]
            url = 'http://mypage.de'
            yield Request(url,callback=self.parse2)
            next.click()
        except Exception as e:
            print('error2!' +  str(e))
        self.driver.close()
        print('ready!')

    def parse2(self,response):
        name="Email"
        print('you are here!')
        formdata = {'name': 'mailfrom@gmx.de'}
        yield FormRequest.from_response(response,
                                formnumber=0,
                                formdata=formdata,
                                clickdata={'value': 'Registrieren'},
                                callback=self.parse3)

    def parse3(self,response):
        print("doneTestRegistration")

1 Ответ

0 голосов
/ 31 мая 2019

Я просматривал документацию здесь https://docs.scrapy.org/en/latest/topics/request-response.html#formrequest-objects и заметил, что вы передаете formnumber внутри своей функции parse2. Если это первая форма на странице, то она должна быть formnumber=0, или вы можете оставить ее, поскольку по умолчанию это ноль.

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