pages/desktop/frontend/reviews.py (200 lines of code) (raw):
from pypom import Region
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as expected
from pages.desktop.base import Base
class Reviews(Base):
_review_count_title_locator = (By.CLASS_NAME, "AddonReviewList-reviewCount")
_filter_by_score_locator = (By.CLASS_NAME, "AddonReviewList-filterByScoreSelector")
_user_review_permalink_locator = (By.CSS_SELECTOR, ".FeaturedAddonReview header")
_addon_summary_card_locator = (By.CLASS_NAME, "AddonSummaryCard")
_featured_review_card_locator = (By.CSS_SELECTOR, ".FeaturedAddonReview-card")
_reviews_list_locator = (By.CSS_SELECTOR, ".AddonReviewList-reviews-listing li")
_editable_rating_stars_locator = (By.CSS_SELECTOR, ".Rating--editable button")
_score_star_highlight_locator = (
By.CSS_SELECTOR,
".Rating--editable .Rating-selected-star",
)
_rating_score_bars_locator = (By.CSS_SELECTOR, ".RatingsByStar-barContainer")
_bar_rating_score_locator = (By.CSS_SELECTOR, ".RatingsByStar-star")
def wait_for_page_to_load(self):
"""Waits for various page components to be loaded"""
self.wait.until(
expected.invisibility_of_element_located((By.CLASS_NAME, "LoadingText")),
message="All reviews page could not be loaded",
)
return self
@property
def reviews_page_title(self):
return self.find_element(*self._review_count_title_locator).text
@property
def reviews_title_count(self):
count = self.reviews_page_title
review_count = count.split()[0].replace(" reviews", "")
return int(review_count.replace(",", ""))
@property
def filter_by_score(self):
return self.find_element(*self._filter_by_score_locator)
@property
def user_review_permalink(self):
return self.find_element(*self._user_review_permalink_locator).text
@property
def addon_summary_card(self):
return self.find_element(*self._addon_summary_card_locator)
@property
def edit_review_score(self):
return self.find_elements(*self._editable_rating_stars_locator)
@property
def selected_score_highlight(self):
return self.find_elements(*self._score_star_highlight_locator)
@property
def reviews_list(self):
return self.find_elements(*self._reviews_list_locator)
@property
def score_bars(self):
return self.find_elements(*self._rating_score_bars_locator)
@property
def bar_rating_score(self):
return self.find_elements(*self._bar_rating_score_locator)
@property
def featured_review_section(self):
el = self.find_element(*self._featured_review_card_locator)
return self.FeaturedReview(self, el)
class FeaturedReview(Region):
_author_locator = (By.CSS_SELECTOR, ".AddonReviewCard-authorByLine")
_body_locator = (By.CSS_SELECTOR, ".ShowMoreCard-contents > div")
_rating_stars_locator = (By.CSS_SELECTOR, ".Rating--small")
@property
def author(self):
return self.find_element(*self._author_locator)
@property
def body(self):
return self.find_element(*self._body_locator)
@property
def rating_stars(self):
return self.find_element(*self._rating_stars_locator)
@property
def review_items(self):
items = self.find_elements(*self._reviews_list_locator)
return [self.UserReview(self, el) for el in items]
class UserReview(Region):
_rating_stars_locator = (By.CSS_SELECTOR, ".Rating--small")
_rating_user_locator = (By.CSS_SELECTOR, ".AddonReviewCard-authorByLine")
_rating_permalink_locator = (By.CSS_SELECTOR, ".AddonReviewCard-authorByLine a")
_selected_star_locator = (
By.CSS_SELECTOR,
".UserReview-byLine .Rating-selected-star",
)
_review_body_locator = (By.CSS_SELECTOR, ".UserReview-body")
_delete_confirm_locator = (
By.CSS_SELECTOR,
".ConfirmationDialog-confirm-button",
)
_flag_review_button_locator = (By.CSS_SELECTOR, ".FlagReviewMenu-menu")
_flag_review_menu_options = (By.CSS_SELECTOR, ".TooltipMenu-inner button")
_flag_review_success_text = (By.CSS_SELECTOR, ".TooltipMenu-inner li")
_flag_review_login_button = (
By.CSS_SELECTOR,
".TooltipMenu-list .Button--micro",
)
_reply_to_review_locator = (By.CSS_SELECTOR, ".AddonReviewCard-allControls a")
_review_reply_textarea_locator = (
By.CSS_SELECTOR,
".DismissibleTextForm-textarea",
)
_publish_reply_button_locator = (By.CSS_SELECTOR, ".DismissibleTextForm-submit")
_reply_text_locator = (
By.CSS_SELECTOR,
".AddonReviewCard-reply .ShowMoreCard-contents > div",
)
_dev_reply_header_locator = (By.CSS_SELECTOR, ".UserReview-reply-header")
_flag_spam_option_locator = (By.CSS_SELECTOR, ".FlagReviewMenu-flag-spam-item")
_flag_bug_option_locator = (By.CSS_SELECTOR, ".FlagReviewMenu-flag-bug-support-item")
_flag_language_option_locator = (By.CSS_SELECTOR, ".FlagReviewMenu-flag-language-item")
@property
def rating_stars(self):
return self.find_element(*self._rating_stars_locator)
@property
def rating_user(self):
return self.find_element(*self._rating_user_locator)
@property
def posting_date(self):
return self.find_element(*self._rating_permalink_locator)
@property
def selected_star(self):
return self.find_elements(*self._selected_star_locator)
@property
def review_body(self):
return self.find_element(*self._review_body_locator).text
def click_confirm_delete_button(self):
self.find_element(*self._delete_confirm_locator).click()
def click_flag_review(self):
self.find_element(*self._flag_review_button_locator).click()
self.wait.until(
expected.visibility_of_element_located(
(By.CSS_SELECTOR, ".TooltipMenu-list")
),
message="The flag review menu did not open",
)
@property
def flag_review_option(self):
return self.find_elements(*self._flag_review_menu_options)
@property
def flag_spam_option(self):
return self.find_element(*self._flag_spam_option_locator)
@property
def flag_bug_option(self):
return self.find_element(*self._flag_bug_option_locator)
@property
def flag_language_option(self):
return self.find_element(*self._flag_language_option_locator)
def select_flag_option(self, count):
self.wait.until(
expected.element_to_be_clickable(
(By.CSS_SELECTOR, ".TooltipMenu-list li:nth-of-type(1)")
),
message="Flag menu options were not loaded",
)
# using JavaScriptExecutor to avoid ElementClickInterceptedException
self.driver.execute_script(
"arguments[0].click();", self.flag_review_option[count]
)
self.wait.until(
expected.text_to_be_present_in_element(
self._flag_review_button_locator, "Flagged"
),
message="Flag review button state did not change",
)
@property
def flag_review_success_text(self):
return self.find_elements(*self._flag_review_success_text)
@property
def flag_review_login_button(self):
self.wait.until(
expected.element_to_be_clickable(self._flag_review_login_button),
message="Login button in Flag review menu was not loaded",
)
return self.find_element(*self._flag_review_login_button)
def click_reply_to_review(self):
reply = self.wait.until(
expected.element_to_be_clickable(self._reply_to_review_locator),
message="Reply button was not loaded",
)
reply.click()
self.wait.until(
expected.element_to_be_clickable(self._review_reply_textarea_locator),
message="Reply text area was not opened",
)
def reply_text_input(self, value):
self.find_element(*self._review_reply_textarea_locator).send_keys(value)
def clear_developer_reply_text_field(self):
self.find_element(*self._review_reply_textarea_locator).clear()
def publish_reply(self):
self.find_element(*self._publish_reply_button_locator).click()
self.wait.until(
expected.visibility_of_element_located(self._dev_reply_header_locator),
message="Developer reply section header was not displayed",
)
@property
def posted_reply_text(self):
return self.find_element(*self._reply_text_locator).text
@property
def dev_reply_header(self):
return self.find_element(*self._dev_reply_header_locator)