Python - В Selenium .text число извлекается и нажимается и удерживается () - PullRequest
0 голосов
/ 05 августа 2020

Как мне извлечь число из элемента? Проблема: 20 пикселей. Я хочу извлечь только число в типе INT.

Вторая проблема, как я могу выбрать случайную точку / местоположение и выделить область внутри элемента? Я действительно не знаю, как использовать action.clickandhold () в пикселях ...

Веб-сайт: https://www.pixact.ly/

Код:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


PATH = "H:/python/venv/chromedriver.exe"
driver = webdriver.Chrome(PATH)
action = ActionChains(driver)
driver.get("https://www.pixact.ly/")

driver.implicitly_wait(10)
driver.find_element_by_id("mobi-close").click()
driver.implicitly_wait(5)
driver.find_element_by_id("enter").click()
driver.implicitly_wait(10)
canvas = driver.find_element_by_id("canvas")
driver.implicitly_wait(5)
pixelwith = driver.find_element_by_xpath("/html/body/section[1]/div/div/p[1]/span").text
pixelheight = driver.find_element_by_xpath("/html/body/section[1]/div/div/p[2]/span").text
pwith = str(pixelwith)
phigh = str(pixelheight)
remw = [int(i) for i in pwith.split() if i.isdigit()]
remh = [int(i) for i in phigh.split() if i.isdigit()]

print(*remw)
print(*remh)
#action.drag_and_drop_by_offset(canvas,)

1 Ответ

0 голосов
/ 05 августа 2020

Вы были очень близки!

Чтобы преобразовать строку в int, вы просто делаете int(string)

Есть много способов удалить часть px, я просто split около px и взял первый элемент в возвращенном массиве - он получит все, что находится слева от px. Краткая версия выглядит так:

return = element.text.split('px')[0]

Выбор случайной точки внутри элемента не требуется для победы в игре. Когда вы делаете щелчок или что-то подобное, он все равно выбирает центр объекта. Если вы действительно хотите, чтобы это была случайная начальная точка, вы можете попробовать actions.move_to_element_with_offset с некоторыми случайными числами, но это усложняет учет. (Дайте мне знать, действительно ли вам нужно, чтобы это была случайная начальная точка)

Также полезно знать, что вам не нужно устанавливать неявное ожидание для каждого действия - вы просто делаете это один раз. driver.implicitly_wait(10) настраивает объект драйвера на динамическое ожидание x секунд перед выдачей ошибки. Каждый вызов, который использует driver после этого, настроен.

Это объединенный окончательный код с тем, как мне нравится сгруппировать вещи: (обратите внимание, что я также не получил объект mobi-close - так что повторно добавьте эту строку, если вам нужно)

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

PATH = "H:/python/venv/chromedriver.exe"
driver = webdriver.Chrome(PATH) 
driver.get("https://www.pixact.ly/")
driver.implicitly_wait(10)

#driver.find_element_by_id("mobi-close").click() # i don't get this
driver.find_element_by_id("enter").click()

#get the elements
width = driver.find_element_by_xpath("//p[contains(text(),'Width')]/span").text.split('px')[0]
height = driver.find_element_by_xpath("//p[contains(text(),'Height')]/span").text.split('px')[0]
canvas = driver.find_element_by_id("canvas")

#run the actions
action = ActionChains(driver)
action.drag_and_drop_by_offset(canvas, width, height).perform()

(Я также обновил ваши идентификаторы xpath, чтобы они были немного более логичными, надеюсь, что все в порядке.)

С этим, вы получите улыбающегося мага c единорога успеха:

unicorn of success


[update - even though no one asked]

I enjoyed it enough to figure out how to do the offset. My laptop is old and the resolution isn't great so i couldn't do the final round (the >200px ranges) without causing errors for it going out of screen range

So this is the alternative to start from the top left to give adequate drawing space:

action = ActionChains(driver)
#action.drag_and_drop_by_offset(canvas, width, height).perform() # old line
action.move_to_element_with_offset(canvas, 10, 10).click_and_hold().pause(1).move_by_offset(width,height).release().perform()

Вставьте это в oop, и вы сможете получать 0 каждый раз : нулевой балл

...