我正在用 Python 撰寫一個玩井字游戲的機器人。該游戲是一個用 React.js 撰寫的 Web 應用程式,并配備了自己的利用 minimax 的 AI。用戶(Python 機器人模擬的)總是 X,AI 總是 O,用戶總是先移動。AI 顯然會不斷更新棋盤的狀態,但 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 上進行字串比較。我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
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。
uj5u.com熱心網友回復:
for i in range(x, y)
意味著我們將采用一個范圍,包括 x 到但不包括 y,所以我認為你的范圍應該是 (0,9)。另外,您的比較是正確的。如果我正確閱讀了您的代碼,那么您應該使用的不是 clickedSquares[i],而是 squares[i]。
for i in range(0,9):
if squares[i] == Tags.exSquare:
clickedSquares.append(i)
if squares[i] == Tags.ohSquare:
clickedSquares.append(i)
這應該有效,因為 squares 是 XPATH 變數的串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/514467.html
上一篇:如何根據從中提取的url將selenium回應從url串列轉換為回應串列?
下一篇:如何在python中使用seleniumWeb驅動程式啟動chrome,而不是作為訪客,而是作為我的chrome組態檔?
