使用drag_and_drop_by_offset时的光标抓取(Python / Selenium)

时间:2019-03-14 21:41:06

标签: python selenium

我需要拖动此比例enter image description here,并在运行此代码时:

HandScale = browser.find_element_by_xpath('//*[@data-xform="scale"]')
GridLineX = browser.find_element_by_class_name('outlined')
bottomLeft = browser.find_element_by_class_name('bottomLeft')
print GridLineX.size
action_chains = ActionChains(browser)
action_chains.drag_and_drop_by_offset(HandScale, 30, 30).click_and_hold(HandScale).perform()

它仍然具有抓取效果,如下所示: enter image description here

在运行脚本的另一部分之前是否有消除此效果的方法?

1 个答案:

答案 0 :(得分:1)

我认为您只需要release()中的action_chains函数即可。在当前文件末尾添加的行将是:

action_chains.release().perform()

在收到反馈后进行编辑,认为这样做无效::如果您在现有release()内执行action_chains,然后在您的pause()之后添加click_and_hold(HandScale) click_and_hold(HandScale),以使点击实际上保持不变,而不会立即释放。最后,由于您在release(HandScale)中使用了webelement参数,因此我将尝试使用action_chains在该元素上发布。因此,如果您使用以下命令,您的 action_chains.drag_and_drop_by_offset(HandScale, 30, 30).click_and_hold(HandScale).pause(5).release(HandScale).perform() 可能会做您想要的事情:

reset_actions()

如果不起作用,则WebDriver API具有一种名为action_chains的方法,根据文档“清除已在本地和远程存储的操作”。我将其添加到当前的perform()下,但是您可以尝试在当前代码的action_chains.reset_actions().perform() 之前插入它。添加的行如下所示:

driver.execute_script("arguments[0].removeAttribute('cursor')", element")

如果这些都不适合您,您可以尝试

public function upload(Request $request)
{
    $fileData   = $request->getContent();
    $fileName   = uniqid().'.xlsx';

    try {
        // save file locally
        Storage::disk('local')->put($fileName, $fileData);

        // dispatch to queue
        AnyJob::dispatch($fileName);

        // insert in import_statuses table for status checking
        AnyModel::create([
            'job_id'  => $fileName
        ]);

    } catch (\Exception $e) {
        error_log($e);

        return response()->json([
            'error' => 'Could not save file or queue not found.'
        ], 500);
    }

    return response()->json([
        'status' => 'OK',
        'jobId'  => $fileName,
    ]);
}

如果您需要的话,我认为可以帮助您确定在以上方法均无效的情况下执行的操作。