从UI更新状态



我正在用Python编写一个玩井字游戏的机器人程序。该游戏是一款用React.js编写的网络应用程序,并配备了自己的AI,该AI利用了极大极小值。用户(Python机器人模拟的(总是X,AI总是O,用户总是先移动。人工智能显然会不断更新棋盘的状态,但Python机器人目前只跟踪自己点击的方块,不会选择已经选择的方块,但不会跟踪棋盘本身。

如何通过UI在Python中更新板的状态我正在使用Selenium通过浏览器与Web应用程序进行交互。这是另一篇文章的后续:python方法没有被调用。

编辑1:

import pytest
import time
import logging
from random import randint
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
LOGGER = logging.getLogger(__name__)
class Tags():
square1 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[1]"
square2 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[2]"
square3 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[3]"
square4 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[4]"
square5 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[5]"
square6 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[6]"
square7 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[7]"
square8 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[8]"
square9 = "(//div[contains(@class, 'board-row')]//button[contains(@class, 'square')])[9]"
exSquare = "//div[contains(@class, 'board-row')]//button[contains(text(), 'X')]"
ohSquare = "//div[contains(@class, 'board-row')]//button[contains(text(), 'O')]"
resultOh = "//div[contains(@class, 'game-info')]//div[contains(text(), 'Winner: O')]"
resultEx = "//div[contains(@class, 'game-info')]//div[contains(text(), 'Winner: X')]"
resultTie = "//div[contains(@class, 'game-info')]//div[contains(text(), 'tie')]"
class TestCase_PlayTTT():

URL = "http://localhost:3000"

@pytest.fixture
def load_browser(self, browser):
browser.get(self.URL)
yield browser

def test_playTTT(self, load_browser):
squares = [Tags.square1,Tags.square2,Tags.square3,
Tags.square4,Tags.square5,Tags.square6,
Tags.square7,Tags.square8,Tags.square9]

clickedSquares = []
random_square = randint(1,9)
time.sleep(5)
winner = ''
if not clickedSquares:
LOGGER.debug("I made it into the first if statement")
element = load_browser.find_element(By.XPATH, squares[random_square])
element.click()
clickedSquares.append(random_square)   

for i in range(1,9):
if clickedSquares[i] == Tags.exSquare:
clickedSquares.append(i)
if clickedSquares[i] == Tags.ohSquare:
clickedSquares.append(i)

for i in clickedSquares:
LOGGER.debug("I made it into the for loop")
if i == random_square:
LOGGER.debug("I made it into the second if statement")
self.test_playTTT(load_browser)
else:
LOGGER.debug("I made it into the first else statement")
clickedSquares.append(random_square)
element = load_browser.find_element(By.XPATH, squares[random_square])
element.click()

这是我添加到代码中的一个片段,用于检查X或O已经填充的正方形:

for i in range(1,9):
if clickedSquares[i] == Tags.exSquare:
clickedSquares.append(i)
if clickedSquares[i] == Tags.ohSquare:
clickedSquares.append(i)

但我得到了一个";列表索引超出范围";错误我认为问题是我试图在XPATH上进行字符串比较。我该怎么解决这个问题?

clickedSquares = []
if not clickedSquares:
clickedSquares.append(random_square)   

for i in range(1,9):
if clickedSquares[i] == Tags.exSquare:
clickedSquares.append(i)
if clickedSquares[i] == Tags.ohSquare:
clickedSquares.append(i)
# What if it is neither X or O?

我认为这是你问题的症结所在。初始化一个数组,添加1个项,然后尝试迭代9个项。在我看来似乎超出了范围。

我觉得有点奇怪,你在一个循环中操纵clickedSquares,基本上是在clickedSquares的项上。我可能会将列表分成单独的列表,或者您实际上打算在squares上循环。

for i in range(x, y)

意味着我们将取一个从x到y的范围,所以我认为你的范围应该是(0.9(。此外,你的比较是正确的。如果我读对了你的代码,它不是你应该使用的点击方块[I],而是方块[I]。

for i in range(0,9):
if squares[i] == Tags.exSquare:
clickedSquares.append(i)
if squares[i] == Tags.ohSquare:
clickedSquares.append(i)

这应该起作用,因为正方形是XPATH变量的列表。

最新更新