diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..568b6e1 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..494d9bf --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/python_selenium_1.iml b/.idea/python_selenium_1.iml new file mode 100644 index 0000000..7c9d48f --- /dev/null +++ b/.idea/python_selenium_1.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Homework/chromedriver b/Homework/chromedriver new file mode 100755 index 0000000..df7565d Binary files /dev/null and b/Homework/chromedriver differ diff --git a/Homework/cup.py b/Homework/cup.py new file mode 100644 index 0000000..2084c78 --- /dev/null +++ b/Homework/cup.py @@ -0,0 +1,15 @@ +class Cup: + def __init__(self, cups): + self.cups = cups + + + def cup_oz_convert(self): + return 8 * self.cups + + + def cup_tablespoon_convert(self): + return 16 * self.cups + + + def cup_gallon_convert(self): + return 0.25 * self.cups diff --git a/Homework/cups_converter.py b/Homework/cups_converter.py new file mode 100644 index 0000000..6e75095 --- /dev/null +++ b/Homework/cups_converter.py @@ -0,0 +1,25 @@ +from cup import Cup + +# def test_cup_oz_convert(): +# # Arrange +# cup = Cup(2) +# # Act +# result = cup.cup_oz_convert() +# # Assert +# assert result == 16 +# +# def test_cup_tablespoon_convert(): +# # Arrange +# cup = Cup(3) +# # Act +# result = cup.cup_tablespoon_convert() +# # Assert +# assert result == 48 +# +# def test_cup_gallon_convert(): +# # Arrange +# cup = Cup(5) +# # Act +# result = cup.cup_gallon_convert() +# # Assert +# assert result == 1.25 \ No newline at end of file diff --git a/Homework/offers_menu.py b/Homework/offers_menu.py new file mode 100644 index 0000000..6afbfda --- /dev/null +++ b/Homework/offers_menu.py @@ -0,0 +1,90 @@ +import pytest +from selenium import webdriver +from selenium.webdriver.support.ui import WebDriverWait +import time +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.common.by import By + +class TestOffersMenu: + + @pytest.fixture() + def setup(self): + global driver + global wait + driver = webdriver.Chrome(executable_path="./chromedriver") + wait = WebDriverWait(driver,5) + driver.get("https://testkwidos.tk/") + yield + time.sleep(5) + driver.quit() + + @pytest.mark.usefixtures("setup") + def test_offers(self): + offers = wait.until(EC.presence_of_element_located((By.XPATH,"//*[text()='OFFERS']"))) + offers.click() + + first_caret = wait.until(EC.presence_of_element_located((By.XPATH,"//span[contains(@class, 'caret')][position() = 1]"))) + first_caret.click() + + air_check = wait.until(EC.presence_of_element_located((By.XPATH, "//*[text()='Air conditioning']/preceding-sibling::div"))) + air_check.click() + + exit = driver.find_element_by_xpath("//span[@class='pi pi-times']") + exit.click() + + second_caret = driver.find_element_by_xpath("//span[@class = 'ui-dropdown-trigger-icon ui-clickable pi pi-caret-down']") + second_caret.click() + + state = driver.find_element_by_xpath('//li/span[text() = "California"]') + state.click() + + house_text = wait.until(EC.presence_of_element_located((By.XPATH,"//*[contains(text(),'house')]"))) + assert house_text.text == "house", "Text should be 'house'" + + air_text = wait.until(EC.presence_of_element_located((By.XPATH,"//*[contains(text(),'Air conditioning')]"))) + assert air_text.text == "Air conditioning", "Text should be 'Air conditioning'" + + card = driver.find_element_by_xpath("//div[@class='card card-shape__green']") + background = card.value_of_css_property("background-color") + + assert background == "rgba(224, 241, 222, 1)", "Color should be 'rgba(224, 241, 222, 1)'" + + + + @pytest.mark.usefixtures("setup") + def test_drop_select(self): + offers = wait.until(EC.presence_of_element_located((By.XPATH, "//*[text()='OFFERS']"))) + offers.click() + + second_caret = wait.until(EC.presence_of_element_located((By.XPATH, "//span[@class = 'ui-dropdown-trigger-icon ui-clickable pi pi-caret-down']"))) + second_caret.click() + + states = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='ui-dropdown-items-wrapper']/ul/li/span"))) + + for state in states: + if state.text == 'Wyoming': + state.click() + selected_option = state.text + break + + assert selected_option == 'Wyoming', "Selected option should be Wyoming" + + + + @pytest.mark.usefixtures("setup") + def test_blog_scroll_down(self): + blog = wait.until(EC.presence_of_element_located((By.XPATH, "//*[text()='BLOG']"))) + blog.click() + + driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") + + bottom_text = wait.until(EC.presence_of_element_located((By.XPATH, "//*[text()='Kwidos is the place for new businesses']"))) + + assert bottom_text.text == 'KWIDOS IS THE PLACE FOR NEW BUSINESSES', 'Text should be "KWIDOS IS THE PLACE FOR NEW BUSINESSES"' + + + + + + + diff --git a/Homework/page_objects/base_page.py b/Homework/page_objects/base_page.py new file mode 100644 index 0000000..477e913 --- /dev/null +++ b/Homework/page_objects/base_page.py @@ -0,0 +1,6 @@ +from selenium.webdriver.support.ui import WebDriverWait + +class BasePage: + def __init__(self,driver): + self.driver = driver + self.wait = WebDriverWait(driver, 5) \ No newline at end of file diff --git a/Homework/page_objects/blog_page.py b/Homework/page_objects/blog_page.py new file mode 100644 index 0000000..a86e2a6 --- /dev/null +++ b/Homework/page_objects/blog_page.py @@ -0,0 +1,20 @@ +from page_objects.base_page import BasePage +from selenium.webdriver.support import expected_conditions as ec +from selenium.webdriver.common.by import By + + +class BlogPage(BasePage): + def __init__(self, driver): + super().__init__(driver) + + def blogs_count(self): + blogs = self.wait.until(ec.visibility_of_all_elements_located((By.XPATH, "//span[@class='label label-danger']"))) + for blog in blogs: + print(blog.text) + return len(blogs) + + + + + + diff --git a/Homework/page_objects/consumer.py b/Homework/page_objects/consumer.py new file mode 100644 index 0000000..d9e77b7 --- /dev/null +++ b/Homework/page_objects/consumer.py @@ -0,0 +1,7 @@ +class Consumer(): + def __init__(self, first_name, last_name, phone, email, password): + self.first_name = first_name + self.last_name = last_name + self.phone = phone + self.email = email + self.password = password \ No newline at end of file diff --git a/Homework/page_objects/how_it_works_page.py b/Homework/page_objects/how_it_works_page.py new file mode 100644 index 0000000..8e21332 --- /dev/null +++ b/Homework/page_objects/how_it_works_page.py @@ -0,0 +1,33 @@ +from page_objects.base_page import BasePage +from selenium.webdriver.support import expected_conditions as ec +from selenium.webdriver.common.by import By +import time + + +class HowItWorksPage(BasePage): + def __init__(self, driver): + super().__init__(driver) + + @property + def first_title(self): + return self.wait.until(ec.presence_of_element_located((By.XPATH, "//*[contains(text(),'Here’s what you can do as a Guest User')]"))) + + @property + def first_screenshot(self): + return self.wait.until(ec.element_to_be_clickable((By.XPATH, "(//img[@style='cursor: pointer'])[1]"))) + + @property + def close_image(self): + return self.wait.until(ec.presence_of_element_located((By.XPATH, "//div[@class='inside close-image']"))) + + @property + def image_on_screen(self): + return self.wait.until(ec.visibility_of_all_elements_located((By.XPATH,"//img[@id = 'current-image']"))) + + def open_screenshot(self): + self.first_title.click() + self.first_screenshot.click() + + def close_screenshot(self): + self.close_image.click() + diff --git a/Homework/page_objects/landing_page.py b/Homework/page_objects/landing_page.py new file mode 100644 index 0000000..b6de327 --- /dev/null +++ b/Homework/page_objects/landing_page.py @@ -0,0 +1,63 @@ +from Homework.page_objects.offers_page import OffersPage +from Homework.page_objects.sign_in_page import SignInPage +from Homework.page_objects.blog_page import BlogPage +from Homework.page_objects.how_it_works_page import HowItWorksPage +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as ec +from selenium.webdriver.common.by import By +from page_objects.base_page import BasePage +import time + +class LandingPage(BasePage): + def __init__(self, driver): + super().__init__(driver) + + @property + def offers(self): + return self.wait.until(ec.element_to_be_clickable((By.XPATH,"//*[text()='OFFERS']"))) + + @property + def sign_in(self): + return self.wait.until(ec.element_to_be_clickable((By.XPATH,"//*[text()='SIGN IN']"))) + + @property + def blog(self): + return self.wait.until(ec.element_to_be_clickable((By.XPATH, "//*[text()='BLOG']"))) + + @property + def how_it_works(self): + return self.wait.until(ec.element_to_be_clickable((By.XPATH, "//*[text()='HOW IT WORKS']"))) + + def open(self): + self.driver.get("https://testkwidos.tk/") + + def open_offers(self): + self.offers.click() + return OffersPage(self.driver) + + def open_sign_in(self): + self.sign_in.click() + return SignInPage(self.driver) + + def open_blog(self): + self.blog.click() + return BlogPage(self.driver) + + def open_how_it_works(self): + self.how_it_works.click() + return HowItWorksPage(self.driver) + + @property + def menu_items_list(self): + return self.wait.until(ec.visibility_of_all_elements_located((By.XPATH,"//a//p"))) + + def hover(self): + for item in self.menu_items_list: + print('\nItem:', item.text,'\nColor before',item.value_of_css_property('color')) + ActionChains(self.driver).move_to_element(item).perform() + print('Color after', item.value_of_css_property('color')) + + + + + diff --git a/Homework/page_objects/offers_page.py b/Homework/page_objects/offers_page.py new file mode 100644 index 0000000..d7120bd --- /dev/null +++ b/Homework/page_objects/offers_page.py @@ -0,0 +1,89 @@ + +from page_objects.base_page import BasePage +from selenium.webdriver.support import expected_conditions as ec +from selenium.webdriver.common.by import By +import time + +class OffersPage(BasePage): + def __init__(self, driver): + super().__init__(driver) + + @property + def dropdown_service_type(self): + return self.wait.until(ec.visibility_of_element_located( + (By.CSS_SELECTOR, ".ui-multiselect-trigger-icon.ui-clickable.pi.pi-caret-down"))) + + @property + def dropdown_service_close(self): + return self.driver.find_element_by_css_selector(".ui-multiselect-close.ui-corner-all") + + @property + def dropdown_state(self): + return self.driver.find_element_by_css_selector(".ui-dropdown-trigger-icon.ui-clickable.pi.pi-caret-down") + + @property + def dropdown_county(self): + return self.driver.find_element_by_xpath("(//*[@class='ui-multiselect-trigger-icon ui-clickable pi pi-caret-down'])[2]") + + @property + def dropdown_county_close(self): + return self.driver.find_element_by_css_selector(".pi.pi-times") + + @property + def title(self): + return self.wait.until(ec.visibility_of_any_elements_located((By.CSS_SELECTOR,"h3"))) + + @property + def status(self): + return self.wait.until(ec.visibility_of_any_elements_located((By.XPATH, "//p[text()='Accepting bids']"))) + + @property + def service(self): + return self.wait.until(ec.visibility_of_any_elements_located((By.XPATH, "//p[contains(text(),'Air conditioning')]"))) + + @property + def originated_by(self): + return self.wait.until(ec.visibility_of_any_elements_located((By.CSS_SELECTOR, "//p[text()='Home Owner']"))) + + @property + def r_letter(self): + return self.wait.until(ec.visibility_of_any_elements_located((By.XPATH, "//*[@class='job-site-code job-site-code__color--green'][text()='R']"))) + + @property + def all_counties(self): + return self.wait.until(ec.visibility_of_element_located((By.XPATH,"(//*[@class='ui-chkbox-box ui-widget ui-corner-all ui-state-default'])[1]"))) + + def choose_service_type(self, service): + self.dropdown_service_type.click() + service_type = self.wait.until(ec.visibility_of_element_located((By.XPATH,f"//*[text()='{service}']/preceding-sibling::div"))) + service_type.click() + self.dropdown_service_close.click() + + def choose_state(self,state): + self.dropdown_state.click() + state = self.driver.find_element_by_xpath(f"//span[text()='{state}']") + state.click() + + def choose_all_counties(self): + self.dropdown_county.click() + time.sleep(2) + self.all_counties.click() + self.dropdown_county_close.click() + + def is_title_exist(self): + return len(self.title) == 1 + + def is_status_exist(self): + return len(self.status) == 1 + + def is_service_exist(self): + return len(self.title) == 1 + + def is_originated_by_exist(self): + return len(self.title) == 1 + + def is_r_letter_exist(self): + return len(self.title) == 1 + + + diff --git a/Homework/page_objects/sign_in_page.py b/Homework/page_objects/sign_in_page.py new file mode 100644 index 0000000..9aaec4b --- /dev/null +++ b/Homework/page_objects/sign_in_page.py @@ -0,0 +1,42 @@ +from page_objects.base_page import BasePage +from selenium.webdriver.support import expected_conditions as ec +from selenium.webdriver.common.by import By + + +class SignInPage(BasePage): + def __init__(self, driver): + super().__init__(driver) + + @property + def email(self): + return self.wait.until(ec.presence_of_element_located((By.ID, "email"))) + + @property + def password(self): + return self.driver.find_element_by_id("password") + + @property + def submit_button(self): + return self.driver.find_element_by_xpath("//button[@type='submit']") + + @property + def show_psswd(self): + return self.driver.find_element_by_xpath("//i[@class='fa fa-eye']") + + def get_consumer(self): + return self.wait.until(ec.presence_of_element_located((By.XPATH, "//span[@class='user-name-individual']"))) + + def login(self, email, password, first_name, last_name): + self.email.send_keys(email) + self.password.send_keys(password) + self.show_psswd.click() + self.submit_button.click() + # consumer_name = self.get_consumer().text + # consumer_name.strip() + # print(consumer_name) + # + # assert consumer_name == f"{first_name} {last_name}" + + + + diff --git a/Homework/pet.json b/Homework/pet.json new file mode 100644 index 0000000..f026885 --- /dev/null +++ b/Homework/pet.json @@ -0,0 +1,18 @@ +{ + "id": 100200300, + "category": { + "id": 0, + "name": "rabbits" + }, + "name": "Cowboy", + "photoUrls": [ + "https://kidszoo.org/wp-content/uploads/2015/11/bunny-rabbit.jpg" + ], + "tags": [ + { + "id": 1, + "name": "rabbit" + } + ], + "status": "available" +} \ No newline at end of file diff --git a/Homework/tests/order.json b/Homework/tests/order.json new file mode 100644 index 0000000..10aab05 --- /dev/null +++ b/Homework/tests/order.json @@ -0,0 +1,8 @@ +{ + "id": 111222333444555, + "petId": 555333, + "quantity": 5, + "shipDate": "2020-03-03T04:15:28.811Z", + "status": "placed", + "complete": true +} diff --git a/Homework/tests/pet.json b/Homework/tests/pet.json new file mode 100644 index 0000000..3edcee6 --- /dev/null +++ b/Homework/tests/pet.json @@ -0,0 +1,18 @@ +{ + "id":99332222555, + "category":{ + "id":0, + "name":"cats" + }, + "name":"Anfisa new new", + "photoUrls":[ + "https://icatcare.org/app/uploads/2018/07/Thinking-of-getting-a-cat.png" + ], + "tags":[ + { + "id":1, + "name":"kittens" + } + ], + "status":"available" +} \ No newline at end of file diff --git a/Homework/tests/test_blog.py b/Homework/tests/test_blog.py new file mode 100644 index 0000000..8c34aeb --- /dev/null +++ b/Homework/tests/test_blog.py @@ -0,0 +1,20 @@ +import pytest +from selenium import webdriver +from Homework.page_objects.landing_page import LandingPage + + +class TestBlog: + @pytest.fixture() + def test_setup(self): + global driver + driver = webdriver.Chrome(executable_path="/Users/lanapaulikava/PycharmProjects/python_selenium_1/Homework/chromedriver") + yield + driver.quit() + + @pytest.mark.skip + def test_count_blogs(self, test_setup): + landing_page = LandingPage(driver) + landing_page.open() + blog_page = landing_page.open_blog() + count = blog_page.blogs_count() + assert count == 12, "Number of blogs should be 12!" diff --git a/Homework/tests/test_consumer_login.py b/Homework/tests/test_consumer_login.py new file mode 100644 index 0000000..e377ced --- /dev/null +++ b/Homework/tests/test_consumer_login.py @@ -0,0 +1,24 @@ +import pytest +from selenium import webdriver +from Homework.page_objects.landing_page import LandingPage +from Homework.page_objects.consumer import Consumer + +import time + +class TestLogin: + @pytest.fixture() + def test_setup(self): + global driver + driver = webdriver.Chrome(executable_path="/Users/lanapaulikava/PycharmProjects/python_selenium_1/Homework/chromedriver") + + yield + driver.quit() + + @pytest.mark.skip + def test_consumer_login(self, test_setup): + landing_page = LandingPage(driver) + consumer = Consumer('Test', 'Testlp', '9999999999', 'lana.test1@yahoo.com', 'new@20passworD') + landing_page.open() + sign_in = landing_page.open_sign_in() + sign_in.login(consumer.email, consumer.password, consumer.first_name, consumer.last_name) + time.sleep(5) \ No newline at end of file diff --git a/Homework/tests/test_how_it_works.py b/Homework/tests/test_how_it_works.py new file mode 100644 index 0000000..b73a369 --- /dev/null +++ b/Homework/tests/test_how_it_works.py @@ -0,0 +1,22 @@ +import pytest +from selenium import webdriver +from Homework.page_objects.landing_page import LandingPage + + +class TestHowItWorks: + @pytest.fixture() + def test_setup(self): + global driver + driver = webdriver.Chrome(executable_path="/Users/lanapaulikava/PycharmProjects/python_selenium_1/Homework/chromedriver") + yield + driver.quit() + + @pytest.mark.skip + def test_open_close_screenshot(self, test_setup): + landing_page = LandingPage(driver) + landing_page.open() + how_it_works = landing_page.open_how_it_works() + how_it_works.open_screenshot() + how_it_works.close_screenshot() + + \ No newline at end of file diff --git a/Homework/tests/test_landing_menu.py b/Homework/tests/test_landing_menu.py new file mode 100644 index 0000000..f06b597 --- /dev/null +++ b/Homework/tests/test_landing_menu.py @@ -0,0 +1,19 @@ +import pytest +from selenium import webdriver +from Homework.page_objects.landing_page import LandingPage + + +class TestLandingMenu: + @pytest.fixture() + def test_setup(self): + global driver + driver = webdriver.Chrome(executable_path="/Users/lanapaulikava/PycharmProjects/python_selenium_1/Homework/chromedriver") + yield + driver.quit() + + def test_hover_over_menu(self, test_setup): + landing_page = LandingPage(driver) + landing_page.open() + landing_page.hover() + + diff --git a/Homework/tests/test_offers.py b/Homework/tests/test_offers.py new file mode 100644 index 0000000..44e08bd --- /dev/null +++ b/Homework/tests/test_offers.py @@ -0,0 +1,28 @@ +import pytest +from selenium import webdriver +from Homework.page_objects.landing_page import LandingPage + + +class TestLandingPage: + @pytest.fixture() + def test_setup(self): + global driver + driver = webdriver.Chrome(executable_path="/Users/lanapaulikava/PycharmProjects/python_selenium_1/Homework/chromedriver") + yield + driver.quit() + + @pytest.mark.skip + def test_offers(self, test_setup): + landing_page = LandingPage(driver) + landing_page.open() + offers = landing_page.open_offers() + offers.choose_service_type("Air conditioning") + offers.choose_service_type("Appliance installation") + offers.choose_state("California") + offers.choose_all_counties() + assert offers.is_title_exist() + assert offers.is_status_exist() + assert offers.is_service_exist() + assert offers.is_originated_by_exist() + assert offers.is_r_letter_exist() + diff --git a/Homework/tests/test_orders_api.py b/Homework/tests/test_orders_api.py new file mode 100644 index 0000000..8595fda --- /dev/null +++ b/Homework/tests/test_orders_api.py @@ -0,0 +1,48 @@ +import requests +import pytest +import json + +class TestApiOrders: + + base_url = "http://petstore.swagger.io/v2/" + + def get_order_url(self, id): + url = f"{self.base_url}store/order/{id}" + return url + + def json_data(self): + filename = "order.json" + with open(filename) as file: + return json.load(file) + + + def test_post_pet(self): + payload = json.dumps(self.json_data(), indent=4) + headers = {'Content-type': 'application/json'} + response = requests.post(self.base_url + "store/order", headers=headers, data=payload) + res_dict = json.loads(response.text) + + assert response.status_code == 200 + assert res_dict["id"] == 111222333444555 + assert res_dict["quantity"] == 5 + assert res_dict["status"] == "placed" + + + def test_get_order(self): + response = requests.get(self.get_order_url(111222333444555)) + res_json = response.json() + + assert response.status_code == 200 + assert res_json["id"] == 111222333444555 + assert res_json["petId"] == 555333 + assert res_json["quantity"] == 5 + assert res_json["status"] == "placed" + + + + def test_del_order(self): + response = requests.delete(self.get_order_url(111222333444555)) + assert response.status_code == 200 + + response = requests.get(self.get_order_url(111222333444555)) + assert response.status_code == 404 diff --git a/Homework/tests/test_pets_api.py b/Homework/tests/test_pets_api.py new file mode 100644 index 0000000..1cc7442 --- /dev/null +++ b/Homework/tests/test_pets_api.py @@ -0,0 +1,59 @@ +import requests +import pytest +import json + +class TestApiPets: + + base_url = "http://petstore.swagger.io/v2/" + + def get_pet_url(self, id): + url = f"{self.base_url}pet/{id}" + return url + + def json_data(self): + filename = "pet.json" + with open(filename) as file: + return json.load(file) + + + def test_post_pet(self): + payload = json.dumps(self.json_data(), indent=4) + headers = {'Content-type': 'application/json'} + response = requests.post(self.base_url + "pet", headers=headers, data=payload) + res_dict = json.loads(response.text) + + assert response.status_code == 200 + assert res_dict["id"] == 99332222555 + assert res_dict["name"] == "Anfisa new new" + + + def test_get_pet(self): + response = requests.get(self.get_pet_url(99332222555)) + res_json = response.json() + + assert response.status_code == 200 + assert res_json["id"] == 99332222555 + assert res_json["category"]["name"] == "cats" + assert res_json["name"] == "Anfisa new new" + + + + def test_del_pet(self): + response = requests.delete(self.get_pet_url(99332222555)) + assert response.status_code == 200 + + response = requests.get(self.get_pet_url(99332222555)) + assert response.status_code == 404 + + json_response = json.loads(response.text) + assert json_response["code"] == 1 + assert json_response["type"] == "error" + assert json_response["message"] == "Pet not found" + + + + + + + + diff --git a/chromedriver b/chromedriver new file mode 100755 index 0000000..df7565d Binary files /dev/null and b/chromedriver differ