首页 > 解决方案 > Python Pyautogui通过坐标点击

问题描述

我正在尝试获取元素的位置。我返回坐标,但不幸的是,它总是点击错误的位置。x 坐标是正确的,但 y 总是错误的。通过一些测试,我认为这是因为我在页面上向下滚动。由于可点击元素不在视线范围内,我必须向下滚动。有没有办法来解决这个问题?我只是通过 x 带有变量的元素做了一个临时解决方案。但是这个解决方案感觉它只适用于某些情况。

请注意,在这种情况下,由于无法以这种方式单击按钮,因此我无法使用 find_xpath。请参阅新发布的Youtube Webscraping 评论

newX = 0
newY = 0

options = webdriver.ChromeOptions()
options.add_argument('--lang=en')
options.add_argument("--start-maximized")

driver = webdriver.Chrome(executable_path=r'C:\Users\caspe\OneDrive\Documents\Övrigt\Kodning\Email\chromeDriver\chromedriver.exe', chrome_options=options)
driver.get("https://www.youtube.com/watch?v=FvbtXv8dy00")
time.sleep(3)

wait = WebDriverWait(driver,15)
for item in range(10): 
    wait.until(EC.visibility_of_element_located((By.TAG_NAME, "body"))).send_keys(Keys.DOWN)
time.sleep(2)

browser_location = driver.get_window_position()
print(browser_location)

e = driver.find_element_by_xpath("/html/body/ytd-app/ytd-popup-container/paper-dialog/yt-upsell-dialog-renderer/div/div[3]/div[1]/yt-button-renderer/a/paper-button/yt-formatted-string")
position = str(e.location)
x = 1.03*(int((position.split("x': ")[1].split(", 'y':")[0])))
y = 0.73*(int((position.split("'y': ")[1].split("}")[0])))
pyautogui.moveTo(x, y)
pyautogui.click() 
print("clicked")
time.sleep(2)

pyautogui.moveTo(1200, 830)
pyautogui.click() 
print("clicked")
time.sleep(2)

for item in range(5): 
    wait.until(EC.visibility_of_element_located((By.TAG_NAME, "body"))).send_keys(Keys.DOWN)
time.sleep(2)

browser_location = driver.get_window_position()
print(browser_location)

e = driver.find_element_by_xpath("/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[4]/div[1]/div/ytd-comments/ytd-item-section-renderer/div[1]/ytd-comments-header-renderer/div[1]/span")
print(e.location)
position = str(e.location)

print(position.split("x': ")[1].split(", 'y':")[0])
print(position.split("'y': ")[1].split("}")[0])

x = int((position.split("x': ")[1].split(", 'y':")[0]))
y = int((position.split("'y': ")[1].split("}")[0]))

if y == 1215:
    newY = 0.77*y
if x == 250:
    newX = 1.12*x
if y == 1091:
    newY = 0.74*y

pyautogui.moveTo(newX, newY)
pyautogui.click() 
print("clicked")
time.sleep(2)

标签: pythonpython-3.xseleniumselenium-webdriverpyautogui

解决方案


推荐阅读