python - 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)
解决方案
推荐阅读
- laravel - Laravel Excel 导出
- typescript - Swagger 将名称保留在数字枚举中
- ruby - Nokogiri、HTTParty 和 Twitter
- python - 满足两个条件时如何求和,然后将求和的数据放入新的数据框中?
- android - 如何获取 RecyclerView 当前加载的行/项目
- sql - 在 SQL 中,如何找到并返回最接近选定值的时间值?
- r - 如何在不使用索引的情况下提取向量元素
- javascript - 将网站部署到 Netlify 时如何隐藏 API 密钥
- django - 用户名在 Django 自定义模型中保存为空
- c++ - 关于“复杂”树结构的 C++ Makefile