2016-09-28 6 views
0

Я использую Selenium (ChromeDriver), чтобы автоматизировать chess site, но у меня возникли проблемы с нажатием на кусок и его перемещение. Я пробовал click() и ActionChains, но ничего не работает. Вот мой код:Selenium click problem (Python)

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

T = r"C:\Users\HP\Downloads\chromedriver.exe" 
options = webdriver.ChromeOptions() 
options.add_argument("--start-maximized") 
Driver = webdriver.Chrome(T, chrome_options=options) 
Driver.get("https://www.chess.com/play/computer") 
Driver.find_element_by_xpath('//*[@id="boardMessage"]/a').click() 
Piece = WebDriverWait(Driver,10).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="chessboard_boardarea"]/img[22]'))) 
Piece.click() 

Когда я запускаю сценарий, ничего не происходит, но белая пешка должна быть выделена желтым цветом. Может кто-нибудь объяснить, почему .click() или ActionChains не работает? Как я могу заставить его работать?

P.S. Если для решения требуется помощь JavaScript, напишите его более подробно, потому что я вообще не знаю JavaScript.

+0

Ваш код выглядит хорошо для меня. Можете ли вы попробовать добавить небольшую задержку до щелчка? 'время импорта; time.sleep (1) 'перед последней строкой – Amit

+0

@Amit Я добавляю' время' перед последней строкой и работает. –

ответ

0

Это несколько сложно. Шахматные фигуры: IMG s, которые можно щелкнуть, но пустые шахматные квадраты не представлены элементом. Вам нужно будет определить систему координат и использовать move_to_element_with_offset(to_element, xoffset, yoffset), основанный на доске, представленный <div id="chessboard_boardarea" ...> и наклейками A-H и 1-8. Для move_to_element_with_offset() смещения относятся к верхнему левому углу элемента. Таким образом, в этом случае (0,0) - верхний левый угол шахматной доски.

Код ниже должен щелкнуть белую пешку на A2, а затем нажать кнопку A3, которая перемещает его. Плата составляет 640px x 640px. Каждый квадрат составляет 80 пикселей. Код щелкает в середине квадрата так:

  • A8 будет 40,40
  • А1 40600
  • H8 является 600,40
  • Н1 600.600

board = Driver.find_element_by_id("chessboard_boardarea") 
action_chains = ActionChains(Driver) 
action_chains.move_to_element_with_offset(board, 40, 520).click().perform() # A2 
action_chains.move_to_element_with_offset(board, 40, 440).click().perform() # A3 

Вы можете определить, какая деталь представлена ​​элементом (IMG), просмотрев имя файла в атрибуте src. Например, src="//images.chesscomfiles.com/chess-themes/pieces/neo/80/bn.png" имеет имя файла bn.png и является черным рыцарем. Каждое имя файла изображения будет состоять из двух букв. Первая буква - это цвет детали, который является либо «b» для черного, либо «w» для белого. Вторая буква - это имя пьесы, пешка «p», «r» ладья, рыцарь «n», «b», «qu» и «k». Итак, bn.png - «b» для черных и «n» для рыцаря ... черный рыцарь.

Вы можете определить, где находятся части, используя часть атрибута стиля тегов IMG, представляющих разные части. Например, transform: translate(160px, 160px); этот элемент находится на 160,160, который является C6 (коорды являются верхним левым квадратом, а каждый квадрат - 80 пикселей).

+0

Его работы, но квадратные координаты A2 (0,480). Это то же самое, что и в его переводе. –

+0

Что-то пошло не так, и ничего не происходит, когда он нажимает на A3.why Piece не двигается, но остается на том же месте. –

+0

Переводы для A2 (0,480), но это верхний левый угол квадрата. Я бы предложил щелкнуть по центру квадрата, чтобы убедиться, что вы получили правильный квадрат. – JeffC

0

Selenium Webdriver не подходит для этого.

Вы можете попробовать Genie automation tool, если вы ищете бесплатный инструмент. Я пробовал свои руки на Джини, это немного сложно, но в конце он решает вашу проблему.

+0

Selenium работает просто отлично. Почему Genie лучше в этом случае? – JeffC

+0

с использованием кликов, основанных на координатах, впоследствии приведет к сбою при изменении экрана/разрешения. Genie будет генерировать идентификаторы для вас для каждого из этих элементов. –

+0

На открытых площадках нет элементов. – JeffC