Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

как подогнать эту прогу с русского ебея под еу ебей?

webdriver
testng
selenium
python
Теги: #<Tag:0x00007fedb83be478> #<Tag:0x00007fedb83be338> #<Tag:0x00007fedb83be1f8> #<Tag:0x00007fedb83be0b8>

#1

Проблема (Вопрос) заключается …

Я попытался сделать авто вбив данных (имя, фамилия, адрес и тд)

У меня получилось прога, которая работает только на русском ебее, а мне нужно на европейском ебее

У меня не получилось подогнать прогу под еу ебей, выбивает ошибку подключения

Код

from selenium import webdriver
import selenium
from tkinter import ttk
import tkinter
from tkinter.filedialog import askopenfilename
from selenium.webdriver.support.ui import Select
from selenium.webdriver.remote.command import Command
from time import sleep
import threading
import time
import datetime
import random
######################################################################################
# Constants
label_x = 10
font = 'Arial 10'
button_width = 20
color = 'white'
current_path = '/'
file_time = datetime.datetime.now().strftime('%y-%m-%d %H-%M-%S')

# Основное окно приложения
root = tkinter.Tk()
root.title('PayDay Ebay')
root.geometry('290x350')
root.configure(bg='white')
root.iconbitmap('icon.ico')


# Элементы гуи
entry_1 = ttk.Entry()
entry_2 = ttk.Entry()
entry_3 = ttk.Entry()
entry_4 = ttk.Entry()
entry_5 = ttk.Entry()
entry_6 = ttk.Entry()
entry_7 = ttk.Entry()
entry_8 = ttk.Entry()
entry_9 = ttk.Entry()
entry_10 = ttk.Entry()
label_1 = tkinter.Label(text='firstName:', bg=color, font=font)
label_2 = tkinter.Label(text='lastName:', bg=color, font=font)
label_3 = tkinter.Label(text='country:', bg=color, font=font)
label_4 = tkinter.Label(text='address1:', bg=color, font=font)
label_5 = tkinter.Label(text='city:', bg=color, font=font)
label_6 = tkinter.Label(text='state:', bg=color, font=font)
label_7 = tkinter.Label(text='zip:', bg=color, font=font)
label_8 = tkinter.Label(text='email_for_address:', bg=color, font=font)
label_9 = tkinter.Label(text='start_page:', bg=color, font=font)
label_10 = tkinter.Label(text='Proxy type:', bg=color, font=font)


# Упаковщики
label_1.place(x=label_x, y=10)
label_2.place(x=label_x, y=40)
label_3.place(x=label_x, y=70)
label_4.place(x=label_x, y=100)
label_5.place(x=label_x, y=130)
label_6.place(x=label_x, y=160)
label_7.place(x=label_x, y=190)
label_8.place(x=label_x, y=220)
label_9.place(x=label_x, y=250)
label_10.place(x=label_x, y=280)
entry_1.place(x=80, y=10)
entry_2.place(x=80, y=40)
entry_3.place(x=70, y=70)
entry_4.place(x=80, y=100)
entry_5.place(x=45, y=130)
entry_6.place(x=50, y=160)
entry_7.place(x=40, y=190)
entry_8.place(x=125, y=220)
entry_9.place(x=85, y=250)
entry_10.place(x=85, y=280)

# Открываем нужные файлы
log = open(file_time+'_log.txt', 'w')
add_cart = open(file_time+'_add_cart.txt', 'w')
new_pass = open(file_time+'_create_new_password.txt', 'w')
link_card = open(file_time+'_link_card.txt', 'w')
merch = open(file_time+'_return_to_merchant.txt', 'w')
security = open(file_time+'_security_check_file.txt', 'w')
wrong_pass = open(file_time+'_wrong_password.txt', 'w')
made = open(file_time+'_Отработка.txt', 'w')
goods = open(file_time+'_goods.txt', 'w')


def get_browser_status(driver):
    try:
        driver.execute(Command.STATUS)
        return(True)
    except:
        return(False)


######################################################################################


def load_base():
	global base_list
	base_list = []
	name = askopenfilename()
	with open(name, 'r', encoding='utf-8') as base_file:
		base_list = base_file.readlines()


def start():
	# Настройки
	firstName = entry_1.get()
	# Фамилия
	lastName = entry_2.get()
	# Страна
	country = entry_3.get()
	# Адрес
	address1 = entry_4.get()
	# Город
	city = entry_5.get()
	# Регион
	state = entry_6.get()
	# Почтовый индекс
	zip = entry_7.get()
	# Емейл
	email_for_adres = entry_8.get()
	# Ссылка на то, что хотим купить
	start_page = entry_9.get()
	# КОНЕЦ НАСТРОЙКИ
	email = ''
	line_num = 0
	while line_num < len(base_list):
		try:
			#Рандомная генерация номера телефона
			dayphone1 = '895' + str(random.randint(1,9)) + str(random.randint(1,7)) + str(random.randint(1,7)) + str(random.randint(1,9)) + str(random.randint(1,8)) + str(random.randint(1,5)) + str(random.randint(1,7)) + str(random.randint(1,9))
			base_line_good = base_list[line_num].strip()
			dvoetochie = base_line_good.find(':')
			email = base_line_good[0 : dvoetochie]
			password = base_line_good[dvoetochie + 1 : len(base_line_good)]
			print(str(line_num + 1) + ': ' + email + ':' + password)
			profile = webdriver.ChromeOptions()
			#Настройка прокси
	######################################################################################
			proxy = '127.0.0.1'
			proxy_port = 1080 # ЧИСЛО
			prox = proxy+':'+str(proxy_port)
			if entry_10.get() == '1':
				profile.add_argument('proxy-server=socks5://'+prox)
			elif entry_10.get() == '2':
				profile.add_argument('proxy-server=http://' + prox)
			else:
				pass
	######################################################################################
			browser = webdriver.Chrome(chrome_options=profile)
			browser.get(start_page)
		#Выбираем первый параметр:
		#	sleep(3)
		#	param = browser.find_element_by_id('msku-sel-1')
		#	all_options = param.find_elements_by_tag_name('option')
		#	for option in all_options:
		#		if option.get_attribute('value') == '0':
		#			option.click()
		#			break

		#	sleep(3)
		#	param = browser.find_element_by_id('msku-sel-2')
		#	all_options = param.find_elements_by_tag_name('option')
		#	for option in all_options:
		#		if option.get_attribute('value') == '5':
		#			option.click()
		#			break

		#Вводим количество товаров:
		#	count = browser.find_element_by_id('qtyTextBox')
		#	count.clear()
		#	count.send_keys('3')
	######################################################################################
			#Жмем на кпноку "Купить сейчас":
			buy_it_now = browser.find_element_by_id('binBtn_btn')
			buy_it_now.click()
			#Входим как гость
			guest_continue = browser.find_element_by_id('gtChk')
			guest_continue.click()
			#Заполняем адрес, переключаясь на фрейм заполнения адреса
			browser.switch_to.frame('shpFrame')
			sleep(1)
			select = Select(browser.find_element_by_name('country'))
			select.select_by_visible_text(country)
			sleep(1)
			#select.select_by_index(index)
			#select.select_by_visible_text("text")
			#select.select_by_value(value)
			#Имя
			browser.find_element_by_id('firstName').send_keys(firstName)
			#Фамилия
			browser.find_element_by_id('lastName').send_keys(lastName)
			#Адрес
			browser.find_element_by_id('address1').send_keys(address1)
			#Город
			browser.find_element_by_id('city').send_keys(city)
			#Регион
			browser.find_element_by_id('state').send_keys(state)
			#Почтовый индекс
			browser.find_element_by_id('zip').send_keys(zip)
			#Номер телефона
			browser.find_element_by_id('dayphone1').send_keys(dayphone1)
			#Емейл
			browser.find_element_by_id('email').send_keys(email)
			#Подтверждение мыла
			browser.find_element_by_id('confirmEmail').send_keys(email)
			#Продолжить в качестве гостя кнопка
			browser.switch_to_default_content()
			browser.find_element_by_id('but_address_continue').click()
			#Выбираем чем оплачивать
			sleep(1)
			browser.find_element_by_id('PAYPAL').click()
			sleep(1)
			#Жмем оплату
			browser.find_element_by_id('but_ryp_continue').click()
			#Вход в палку
			sleep(1)
			#paypal_email = browser.find_element_by_id('login_email')
			#paypal_email.clear()
			#paypal_email.send_keys(email)
			#sleep(1)
			paypal_password = browser.find_element_by_id('login_password')
			paypal_password.clear()
			paypal_password.send_keys(password)
			sleep(1)
			paypal_submit = browser.find_element_by_id('submitLogin')
			paypal_submit.click()
	######################################################################################
			#Проверка результата после входа
			made.write(base_line_good + '\n')
			sleep(7)
			source = browser.page_source
			if 'Verify your account' in source:
				security.write(base_line_good+'\n')
				log.write(base_line_good + " Status: Security check\n")
				print('Status: Security check')
				browser.quit()
			elif 'return.x' in source:
				print('Status: Return to merchant')
				log.write(base_line_good + ' Status: Return to merchant\n')
				merch.write(base_line_good+'\n')
				browser.quit()
			elif 'Please check your email address and password and try again' in source:
				wrong_pass.write(base_line_good+'\n')
				log.write(base_line_good + ' Status: Invalid password\n')
				print('Status: Invalid password')
				browser.quit()
			elif 'Link or update your debit or credit card to make an instant payment' in source:
				add_cart.write(base_line_good+'\n')
				log.write(base_line_good + ' Status: Link You Card\n')
				print('Status: Link You Card')
				browser.quit()
			elif 'Add a new debit or credit card' in source:
				add_card.write(base_line_good+'\n')
				log.write(base_line_good + ' Status: Add new card\n')
				print('Status: Add new card')
				browser.quit()
			elif 'Security Measures' in source:
				security.write(base_line_good+'\n')
				log.write(base_line_good + ' Security Measures\n')
				print('Security Measures')
				browser.quit()
			elif 'Vérification de sécurité' in source:
				security.write(base_line_good + '\n')
				log.write(base_line_good + ' Security Measures\n')
				print('Security Measures')
				browser.quit()
			elif 'Create new password' in source:
				new_pass.write(base_line_good+'\n')
				log.write(base_line_good + ' Create new password\n')
				print('Create new password')
				browser.quit()
			elif 'Link a new debit' in source:
				add_card.write(base_line_good+'\n')
				log.write(base_line_good + ' Link a new debit card\n')
				print('Link a new debit card')
				browser.quit()
			#Добавляет в файл хорошие комбинации емейл - пароль, или когда браузер закрывается вами в ручную, после входа в Пейпал.
			else:
				goods.write(base_line_good+'\n')
				log.write(base_line_good + ' Paypal good\n')
				while True:
					sleep(2)
					if get_browser_status(browser) == True:
						pass
					else:
						sleep(2)
						break
				browser.quit()
		except selenium.common.exceptions.NoSuchElementException:
			print('Connection error. Reconnect')
			sleep(2)
			browser.quit()
		except selenium.common.exceptions.WebDriverException:
			print('Connection error. Reconnect')
			sleep(2)
			browser.quit()
		except KeyboardInterrupt:
			print('Abort Keyboard')
			break
		else:
			line_num += 1


def start_1():
	t = threading.Thread(target=start)
	t.start()
# print('████████████████ END WORK █████████████████')
# Кнопки, здесь расположены, т.к. нужно, чтобы они распознавали функции
button_1 = ttk.Button(text='Load base', command=load_base)
button_1['width'] = button_width
button_1.place(x=10, y=310)
button_2 = ttk.Button(text='Start', command=start_1)
button_2['width'] = button_width
button_2.place(x=150, y=310)

root.mainloop()  # Команда для вывода основного окна
root.quit() # Выход после закрытия

log.close()
add_cart.close()
new_pass.close()
made.close()
goods.close()
wrong_pass.close()
merch.close()
security.close()
link_card.close()

(Дмитрий Мирошник) #2

Ухххх… По-моему, тут использованы все возможные антипаттерны :slight_smile:
Несколько советов, которые позволят улучшить код и, возможно, решить проблему:
1). Используйте модульность. Не нужно писать весь тест потоком сознания, разделяя действия ####. Используйте функции для каждого логического шага. Обработка эксепшенов внутри функции позволит понять, на каком шаге возникла проблема.
2). В обработчике эксепшенов использована одно и то же сообщение в лог на разные эксепшены. Как Вы планируте понять, что случилось, если сообщение одинаковое? Кроме того, для NoSuchElementException не мешало бы выводить имя того элемента, который не найден. Поможет локализовать проблему.
3). Использовать sleep - плохая практика. Кто сказал, что за 1 или 3 секунду внешнее приложение гарантированно подгрузит искомый элемент? Это очень плохая практика, которая делает тесты нестабильными. Используйте Conditions, почитайте про Explicit и Implicit waits.
4). [quote=“FaceModern, post:1, topic:16348”]
label_1.place(x=label_x, y=10)
[/quote]

Я не понимаю, что это. Вы кликаете по заданным координатам? Плохая практика. В зависимости от разрешения экрана и адаптивности сайта под размер окна браузера (а также используемого браузера) эти координаты могут “плавать”. Лучше использовать что-нить более адекватное, чтобы найти данный элемент. Например, класс или id.
5). [quote=“FaceModern, post:1, topic:16348”]
entry_1
[/quote]

Неинформативно. Если Вы планируете когда-нить вернуться к этому коду - очень тяжело будет понять, что это такое. Используйте значащие названия, например, text_box_first_name и т.д.
6). Почитайте про PageObject, поможет писать более вменяемый код.

P.S. Я предполагаю, что как минимум 1 элемент из тех, которые Вы ищете, отличается на eu сайте, что и вызывает Ваше сообщение о ошибке соединения. Для того, чтобы грамотно разрулить проблему без использования граблей и костылей, используйте советы выше и перепишите код.


(ex3me0) #3

2 одиночества нашли друг друга называется.
Первый - даже код не писал, второй - нифига в этом коде не соображает, но строит умную рожу и рассказывает про паттерны и правильные ожидания.

Уж извиняйте, грубо, но как есть


(Eugene Moskalenko) #4

Дак, вроде же дельные советы написал @Defender. В примере выше все в куче, и нифига не понятно, даже с комментариями.


(ex3me0) #5

Дельные, только мимо кассы: рандомная генерация телефона, проксификация, сохранение акков у которых привязана палка в профиль. Аппликуха отнюдь не для “тестирования ибея”, чувак просто хочет чтобы ему пофиксили говно-скрипт за спасибо, а тут явно в коммерческий раздел топать надо


(Black Box Blues) #6

Так что ж вы ее сразу на европейском не делали? Или это не ваша прога?


(Дмитрий Мирошник) #7

Чувак, вот честно, мне абсолютно пофиг, для чего эта аппликуха будет использована в дальнейшем. Я написал пачку советов, как улучшить читабельность данного скрипта и локализовать проблему от “всё не работает” до “не может найти конкретный элемент”.

абсолютно не влияют на применимость моих советов, также как и на источник проблемы.


(Artur Korobeynyk) #8

Код понятен, просто чтобы его читать надо было хотя бы раз написать большую практичную прогу на Tk. А ваши патерны на PEP8 идут, который в Tk тяжело применить. Даже правильнее сказать: вы хотите использовать подход тестирования веб аппликации в разработке графического интерфейса, применяя при этом только знания веб тетсирования. Пункты 1, 2, 3 - ОК. Остальные - бред в этом посте.
Ну а переделка под евро ебай… ебай вобщем отсюда. Иди делай лабу самостоятельно, тем более что твой одногрупник уже написал её на ру ебай.


(Дмитрий Мирошник) #9

Я вообще больше джавист, чем питонщик, поэтому никаких прог на Tk я не писал :slightly_smiling_face:
То, с чем я на питоне работаю, не имеет графического интерфейса, это меня и сбило с толку.
Посмотрел, идея понятна. Впрочем, это не отменяет root cause проблемы. Я думаю, что не сильно ошибся с тем, что надо пофиксить несовпадение элементов ру и еу ебея :wink:


(Artur Korobeynyk) #10

Tk = Swing на джаве. Полная копия, я бы сказал.
А руткоз - это автор. В проблеме не разобрался, материал не изучил, самостоятельно над своей же проблемой не работал, запостил чужой исходник без ссылки на автора, без изменений и скорее всего без его разрешения, запостил полный исходник приложения, а не того места, где возникает ошибка. Это только то что в голову сразу приходит. Я почему-то думаю, что этот же вопрос закинут ещё на 10-15 форумов, авось где-нибудь кто-то закинет пофикшеный исходник и можно будет идти к преподу сдавать лабу. А потом через 3-4 года этот парень захочет вайтивайти.