Метод в классе Python не выполняется - PullRequest
0 голосов
/ 23 января 2019

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

К вашему сведению, я пытался исследовать, но все еще не могу понять это.

class SearchCheck:

    def __init__(self, url):
        self.url = url
        self.driver = webdriver.Chrome()

    @property
    def getpage(self):
        self.driver.get(self.url)
        self.driver.implicitly_wait(10)

    @getpage.setter
    def getpage(self, url):
        self.url = url
        self.driver.get(self.url)
        self.driver.implicitly_wait(10)


    def producturls(self):
        search = self.driver.find_element_by_xpath('//*[@id="search-box"]/div[2]/div/div[1]/div/div[1]/input')
        time.sleep(5)
        search.sendkeys('shoes')
        search.sendkeys(Keys.ENTER)
        driver.implicitly_wait(60)
        # Loop through and get links
        for a in self.driver.find_elements_by_xpath('//*[@id="products"]/div[2]/div/div/div/div/div/a'):
            yield a.get_attribute('href')


if __name__ == '__main__':
    start_page = 'https://www.google.com'
    new_urls = RankChecker(start_page)
    new_urls.getpage
    new_urls.producturls()

Когда код попадает в метод producturls, ничего не происходит, просто хромированные окна остаются открытыми на домашней странице и не выполняют поиск и не возвращают URL-адреса.

1 Ответ

0 голосов
/ 23 января 2019

Я добавил рабочий код ниже и перечислил вещи, которые я изменил / изменит здесь:

  1. Ваши xpaths были неверны.Вы можете протестировать их в режиме разработчика вашего браузера.
  2. webdriver send_keys () - это метод для вызова, а не sendkeys ()
  3. Вы пропустили самоопределение перед драйвером внутри метода producturls
  4. Вы ссылались на RankChecker в своем основном методе, даже если ваш класс называется SearchCheck
  5. Вам нужно перебрать ответ от producturls, поскольку он возвращает генератор из-за ключевого слова yield
  6. ПолучательМетод должен вернуть значение.getpage будет иметь больше смысла как метод, поскольку он делает что-то вместо доступа к свойству
  7. Методы / атрибуты Python должны иметь форму get_page, product_urls и т. д. Я не менял их, но просматривал стиль pythonруководство поможет улучшить эти вещи

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

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class SearchCheck:
    def __init__(self, url):
        self.url = url
        self.driver = webdriver.Chrome()

    @property
    def getpage(self):
        self.driver.get(self.url)
        self.driver.implicitly_wait(10)
        return

    @getpage.setter
    def getpage(self, url):
        self.url = url
        self.driver.get(self.url)
        self.driver.implicitly_wait(10)

    def producturls(self):
        search = self.driver.find_element_by_xpath('//input[@title="Search"]')
        time.sleep(5)

        search.send_keys('shoes')
        search.send_keys(Keys.ENTER)
        self.driver.implicitly_wait(60)
        # Loop through and get links
        for a in self.driver.find_elements_by_xpath('//div[@class="srg"]//div[@class="g"]//a'):
            yield a.get_attribute('href')

if __name__ == '__main__':
     start_page = 'https://www.google.com'
     new_urls = SearchCheck(start_page)
     new_urls.getpage
     urls = [url for url in new_urls.producturls()]
     print(urls)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...